#122 买卖股票的最佳时机II 25min
终于自己做出来一个M贪心,但思路和随想录不一样,是仿照那个#376摆动序列,画图做的。需要考虑的特殊情况:单调递增的找不到卖出点[1,2,3,4,5],所以要处理一下prices结尾处
int maxProfit(vector<int>& prices) {
int diffprev=0;
int diffcur=0;
int buy_i=-1;
int sell_i=-1;
int res=0;
for(int i=0;i+1<prices.size();i++){
diffcur=prices[i+1]-prices[i];
if(diffcur>=0 && diffprev<=0 && sell_i==-1){
buy_i=i;
}
if(diffcur<=0 && diffprev>=0 && buy_i>-1){
sell_i=i;
}
if(diffcur>=0 && i+1==prices.size()-1 && buy_i>-1){
sell_i=i+1;
}
if(buy_i>-1 && sell_i>-1){
res+=prices[sell_i]-prices[buy_i];
buy_i=-1;
sell_i=-1;
}
diffprev=diffcur;
}
return res;
}
随想录的思路我真的很难想到,很巧妙:关键-利润可分解到每天 && 只收集正利润!
int maxProfit(vector<int>& prices) {
int result = 0;
for (int i = 1; i < prices.size(); i++) {
result += max(prices[i] - prices[i - 1], 0);
}
return result;
}
#55 跳跃游戏
15min 又自己过了一个,高兴。我的思路:没有0都行,遇到0(不是最后一个)往前检查有没有可能能跨过0
bool canJump(vector<int>& nums) {
//其实只要没有0都true
if(nums.size()==1) return true;
if(nums[0]==0) return false;
for(int i=0;i<nums.size()-1;i++){
if(nums[i]!=0) continue;
int j=i-1;
while(j>=0){
if(nums[j]+j>i) break;
j--;
}
if(j<0) return false;
}
return true;
}
不过我这个时间复杂度看起来是O n^2 随想录的思路是O n
看了这个更新最大范围的思路又写了一遍 很快:
bool canJump(vector<int>& nums) {
int max_dest=0;
for(int i=0;i<nums.size()-1 && i<=max_dest;i++){
max_dest=std::max(max_dest,i+nums[i]);
}
if(max_dest<nums.size()-1) return false;
return true;
}
#45.跳跃游戏II
难,想了20min,发现我想的办法(暴力+从后往前倒着按步骤找) 都是 O n^2 会TLE
学了随想录的思路自己写了一遍,满巧妙的。思路:边往前走边记录这一个step range的路上,可供选择的下一个step 的range最大是多少,等这个step range到头了,就用我们记录下的下一个最大的range
for的结束选择在size-2,不用管最后一个(size-1)的值
int jump(vector<int>& nums) {
int cur_dest=0;
int next_dest=0;
int cnt=0;
for(int i=0;i<nums.size()-1;i++){
next_dest=std::max(next_dest,nums[i]+i);
if(i>=cur_dest){//range of this step is used up
cnt++;
cur_dest=next_dest;//choose to use the farest one
}
}
return cnt;
}