算法第24天|贪心算法:买卖股票的最佳时机Ⅱ、跳跃游戏、跳跃游戏Ⅱ、K次取反后最大化的数组和

买卖股票的最佳时机Ⅱ

题目链接:122. 买卖股票的最佳时机 II - 力扣(LeetCode)

总体思路:

        计算每一天的利润,只要利润大于0的天数,获取的利润和就是总的最大利润。

                注意:利润的数组要比股票价格数组少一位,因为第一天必定没有利润。

总体代码:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        //通过利润,只要是正利润就加
        int sum =0;
        for(int i=1;i<prices.size();i++)
        {
            if(prices[i]-prices[i-1]>0)
            {
                sum += prices[i]-prices[i-1];
            }
        }
        return sum;

        
    }
};

跳跃游戏

题目链接:55. 跳跃游戏 - 力扣(LeetCode)

总体思路:

        整体上就是去求当前坐标与之前的坐标,最远能够覆盖的地方

总体代码:

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int fugai =0;//定义一个覆盖下标位置
        for(int i=0;i<nums.size();i++)
        {
            if(fugai<i)break;
            fugai = fugai<i+nums[i]?i+nums[i]:fugai;//更新覆盖的值
            //如果当前的覆盖值小于当前的值,就退出
            
        }
        //判断
        return fugai>=nums.size()-1;
        
    }
};

跳跃游戏Ⅱ

题目链接:45. 跳跃游戏 II - 力扣(LeetCode)

总体思路:

        同样,通过当前的覆盖范围,然后去遍历覆盖的值,获得最大的下一次覆盖位置。当走到当前覆盖的值的最后位置,要进行下一次跳跃,步数+1,更新当前的覆盖范围。

总体代码:

class Solution {
public:
    int jump(vector<int>& nums) {
        //记录最短的次数
        int cishu = 0;
        //记录当前可以到达的位置
        int cur_weizhi = 0;
        //记录在遍历当前位置的时候,下一次最远可以跳到多少
        int next_weizhi =0;
        for(int i=0;i<nums.size();i++)
        {
            //进行判断:当前的位置是不是已经包含了末尾
            if(cur_weizhi>=nums.size()-1)break;
            //判断当前是不是已经到达了当前能到达的最远位置
            //在遍历当前位置的时候,需要记录下一次最远的位置
            next_weizhi = next_weizhi>i+nums[i]?next_weizhi:i+nums[i];
            if(i==cur_weizhi)
            {
                //替换掉当前的位置为下一次的位置,同时进行次数+1
                cishu +=1;
                cur_weizhi = next_weizhi;
            }
        }
        return cishu ;
        
    }
};

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

题目链接:1005. K 次取反后最大化的数组和 - 力扣(LeetCode)

总体思路:

        (1)有正负,所以先将绝对值大的负数转换成整数使得和变得更大

        (2)如果k还有多余的,就需要将其转换绝对值最小的数,达到影响最小

总体代码:

class Solution {
public:
    int largestSumAfterKNegations(vector<int>& nums, int k) {
        sort(nums.begin(),nums.end());//从小到达排序

        for(int i=0;k>0;k--)//先处理小于0的元素.从最小的开始,最多循环k次
        {
            //需要判断当前是不是已经超过了nums数组
            if(i>=nums.size())break;
            if(nums[i]<0)
            {
                nums[i]= -nums[i];
                i++;
            }
            else //最小的值都大于等于0,可以直接退出了
            {
                break;
            }
        }
        //此时不知道k循环完没有,如果没有需要对最小值进行处理,如果循环完了直接输出和

        sort(nums.begin(),nums.end());
        while(k--)
        {
            nums[0] = -nums[0];
        }
        int sum =0;
        for(int i=0;i<nums.size();i++)
        {
            sum += nums[i];
        }
        return sum;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值