代码随想录算法训练营第32天 | 贪心算法 part02● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II

#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;
        
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值