質問1
並べ替えられた配列を指定すると、配列の新しい長さが削除された後、各要素が1回だけ表示されるように、繰り返し削除要素を配置する必要があります。
スペースの余分な配列を使用しないでください、あなたはしなければならない配置入力配列を変更し、使用のO(1)余分なスペースの条件の下で完了しました。(つまり、重複していないすべてのコンテンツは配列の先頭に並べ替えられ、返される新しい長さnは、この関数を呼び出す人が配列の最初のn個の要素を直接取得できるようにするためのものです)
問題解決:ダブルポインター法を使用する
配列の内容が変更されるため、削除された配列の長さを返すときは、この長さの配列の内容を取得してください。
public int removeDuplicates(int[] nums) {
if (nums.length == 0) return 0;
int i = 0;
for (int j = 1; j < nums.length; j++) {
if (nums[j] != nums[i]) {
i++;
nums[i] = nums[j];
}
}
return i + 1;
}
次の一連のコードは、この関数を実装するときに呼び出す方法です。
// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);
// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}
質問2.株式を売買するのに最適な時期II
配列が与えられた場合、そのi番目の要素は、i番目の日の特定の株式の価格です。
あなたが得ることができる最大の利益を計算するためのアルゴリズムを設計します。できるだけ多くのトランザクションを完了することができます(株式を複数回売買する)。
注:複数の取引に同時に参加することはできません(再度購入する前に、以前の株式を売却する必要があります)。
といった:
方法1:私は書いた
class Solution {
public int maxProfit(int[] prices) {
int ifbuy=0; //标记购买状态,0为未购买,1为已购买
int buy=0; //在数组的何处买进
int sell=0; //在数组的何处卖出
int benifit=0; //利润总和
for(int i=1;i<prices.length;i++){
//如果价格下跌
if(prices[i]<prices[i-1]){
// 如果已买进,价格要下跌了,那就得卖出了
if(ifbuy!=0){
ifbuy=0;
sell = i-1;
benifit = benifit+prices[sell]-prices[buy];
}
// 如果还未买进,那么就不买。
else{
buy++;
//不买
}
}
//如果价格上涨或持平
else{
// 如果已经是数组的最后一个元素,且已经买了,那应该卖出
if(i == prices.length-1 && ifbuy==1){
benifit = benifit +prices[i]-prices[buy];
}
// 如果价格要涨了,但还没买,那应该买进了
else if(ifbuy==0){
buy = i-1;
ifbuy=1;
// 如果是最后两个元素在相比,那么应该买入,且再卖出
if(i == prices.length-1 && ifbuy==1){
benifit = benifit +prices[i]-prices[buy];
}
}
else{
//价格还在涨,不卖
}
}
}
return benifit;
}
}
方法2、標準的な答え1-動的計画法
class Solution {
public int maxProfit(int[] prices) {
int n = prices.length;
int[][] dp = new int[n][2];
dp[0][0] = 0;
dp[0][1] = -prices[0];
for (int i = 1; i < n; ++i) {
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + prices[i]);
dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
}
return dp[n - 1][0];
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/solution/mai-mai-gu-piao-de-zui-jia-shi-ji-ii-by-leetcode-s/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
int dp0 = 0, dp1 = -prices[0];
for (int i = 1; i < n; ++i) {
int newDp0 = max(dp0, dp1 + prices[i]);
int newDp1 = max(dp1, dp0 - prices[i]);
dp0 = newDp0;
dp1 = newDp1;
}
return dp0;
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/solution/mai-mai-gu-piao-de-zui-jia-shi-ji-ii-by-leetcode-s/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
方法3、標準回答2欲張りアルゴリズム
、つまり、1日目に購入し、2日目に価格が上昇し、2日目に販売しました。3日目に価格が上昇した場合は、販売しました。 2日目に購入しました。3日後にもう一度販売します。(タイトルは1日に1回しか
売買できない必要がないため)上昇した場合は売買し、下降した場合は買わないのと同じです。
class Solution {
public int maxProfit(int[] prices) {
int ans = 0;
int n = prices.length;
for (int i = 1; i < n; ++i) {
ans += Math.max(0, prices[i] - prices[i - 1]);
}
return ans;
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/solution/mai-mai-gu-piao-de-zui-jia-shi-ji-ii-by-leetcode-s/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
また貪欲で、このアルゴリズムは理解しやすいです
public int maxProfit(int[] arr) {
if (arr == null || arr.length <= 1) return 0;
int ans = 0;
for (int i = 1; i < arr.length; i++) {
if (arr[i] > arr[i-1]) {
// 卖出有利可图
ans += (arr[i] - arr[i-1]);
}
}
return ans;
}