代码随想录 第八章 贪心算法 part02 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II 1005.K次取反后最大化的数组和

122.买卖股票的最佳时机II

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int result=0, pre=prices[0];
        for(int i=0;i<prices.size();i++){
            if(pre<prices[i]){
                result+=(prices[i]-pre);
                pre=prices[i];
            }else if(pre>prices[i]){
                pre=prices[i];
            }
        }
        return result;
    }
};

这题实际上就是求增量,指对序列中有增量的相邻元素做计算,下降的部分不做处理。是一种开天眼式的炒股计算)

55. 跳跃游戏

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int rg=0;
        for(int i=0;i<nums.size();i++){
            if(i>rg) return false;
            if((i+nums[i])>rg) rg=i+nums[i];
        }
        return true;
    }
};

这题笔者一下子没想到,只想到暴力求解,看了眼随想录的思路,看到范围俩字就悟了,从一个位置开始由最大跳数就可以求的在一个位置下一步最远能到哪的范围,对最大范围内的元素遍历,找到更大的最大范围,直到遍历完序列中的所有元素,或超过最大范围,如果是因为超出最大范围结束,表明无法跳到序列尾。

45.跳跃游戏II

class Solution {
public:
    int jump(vector<int>& nums) {
        vector<int>step(nums.size(),INT_MAX);
        step[0]=0;
        for(int i=0;i<nums.size();i++){
            for(int rg=nums[i];rg>0;rg--){
                if(i+rg<nums.size()){
                    if(step[i+rg]>(step[i]+1)) step[i+rg]=step[i]+1;
                }
            }
        }
        return step[nums.size()-1];
    }
};

这题笔者从上一题的思路开始延伸,这题在保证序列可达序列尾的条件下求取最小跳数。所以用step承担记录范围与最小跳数的功能。

1005.K次取反后最大化的数组和

class Solution {
public:
    int largestSumAfterKNegations(vector<int>& nums, int k) {
        int result=0, mn=INT_MAX;
        sort(nums.begin(), nums.end());
        for(int i=0;i<nums.size();i++){
            if(nums[i]<0&&k>0){
                nums[i]=-nums[i];
                k--;
            }
            if(nums[i]>=0&&mn>nums[i]) mn=nums[i];
            result+=nums[i];
        }
        if(k%2==1) result-=2*mn;
        return result;
    }
};

这题由几种可能性,第一种是是负数多余反转次数,需要将反转次数给尽可能小的负数,第二种是负数少于反转次数且所有负数反转后反转次数为偶,表明将所有数转为正再求和即可,第三种是所有负数反转后反转次数为奇,则需要选一个绝对值最小的数作为唯一的负数。

代码随想录 第八章 贪心算法 part02

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值