贪心算法part02算法

贪心算法part02

● 122.买卖股票的最佳时机II
● 55. 跳跃游戏
● 45.跳跃游戏II

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

https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/description/

class Solution {
    public int maxProfit(int[] prices) {
        //p[3]-p[0]=p[3]-p[2]+p[2]-p[1]+p[1]-p[0];
        //每段都算出来存入数组中(正负数都存进去),只取>0的进行相加
        int[] dayPrice=new int[prices.length-1];
        int result=0;
        for(int i=1;i<prices.length;i++){
            dayPrice[i-1]=prices[i]-prices[i-1];
        }
        for(int i=0;i<dayPrice.length;i++){
            if(dayPrice[i]>0){
                result+=dayPrice[i];
            }
        }
        return result;
    }
}

2.leetcode 55. 跳跃游戏

https://leetcode.cn/problems/jump-game/description/

class Solution {
    public boolean canJump(int[] nums) {
        //最初位于数组的第一个下标 ,每个元素代表你在该位置可以跳跃的最大长度
        //判断你是否能够到达最后一个下标

        //我们不去纠结每次跳多少,怎么跳
        //而是去看跳了之后能不能把最后一个覆盖到
        //对于只有一个元素的数组,//无论如何他都是在最后一个下标了
        if(nums.length==1){return true;}
        //只能是在我们的股改范围内移动
        int cover=0;
        for(int i=0;i<=cover;i++){
            //cover=i+nums[i];//到达覆盖位置的下标
            //再覆盖范围内更新最大覆盖范围
            cover=Math.max(i+nums[i],cover);
            if(cover>=nums.length-1){
                //到达最后位置的下标
                return true;
            }
        }
        //都结束了,还没有返回,那就是没有能达到最后一个下标了
        return false;
    }
}

3.leetcode 45.跳跃游戏II

https://leetcode.cn/problems/jump-game-ii/description/

class Solution {
    public int jump(int[] nums) {
        //当数组元素只有一个的时候,跳跃到下标为最后一个步数为0
        if(nums.length==1){
            return 0;
        }
        //当前覆盖范围的下标
        int cur=0;
        //下一次覆盖范围的下标
        int next=0;
        //记录结果
        int result=0;
        for(int i=0;i<nums.length;i++){
            //记录下一次的覆盖范围,每次都记录最大的覆盖范围
            next=Math.max(next,i+nums[i]);
            //如果当前的下标已经到了当前的覆盖范围了
            if(i==cur){
                //如果当前覆盖范围不是最后下标的位置
                if(cur!=nums.length-1){
                    //那么就让当前覆盖范围到上面记录的下一次的坐标
                    cur=next;
                    //累加步数
                    result++;
                    //如果当前覆盖范围大于或者等于数组最后下标位置,那么终止循环
                    if(cur>=nums.length-1){break;}
                }else{
                    //到了最后一个位置,那么步数也早就更新了
                    //跳出循环
                    break;
                }
            }
        }
        return result;
    }
}
  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
贪心算法是一种常用的算法思想,它通常用于求解最优化问题。贪心算法的基本思想是:每一步都选择当前状态下最优的解,最终得到全局最优解。但是,贪心算法并不是所有问题都适用,有些问题需要进行证明才能确定贪心算法的正确性。 其中,反证法是一种常用的证明方法。反证法的基本思想是:假设所要证明的命题不成立,然后推导出一个矛盾的结论,从而证明原命题成立。 在贪心算法中,反证法通常用于证明贪心选择性质和最优子结构性质。具体来说,假设贪心算法得到的解不是最优解,然后推导出一个矛盾的结论,从而证明贪心算法得到的解是最优解。 举个例子,假设有一个背包问题,要求在背包容量为C的情况下,选择一些物品放入背包中,使得背包中物品的总价值最大。每个物品有两个属性:重量w和价值v。贪心算法可以选择每次选择单位重量价值最大的物品放入背包中。我们可以使用反证法来证明这个贪心算法的正确性: 假设贪心算法得到的解不是最优解,即存在一种更优的解。我们假设这个更优的解选择了物品i和物品j,但是贪心算法没有选择物品j,而是选择了物品k。那么我们可以得到以下两个不等式: v[i]/w[i] > v[j]/w[j] (物品i的单位重量价值大于物品j的单位重量价值) v[i]/w[i] < v[k]/w[k] (物品i的单位重量价值小于物品k的单位重量价值) 将这两个不等式相乘,得到: v[i]*v[k] > v[j]*w[i] 由于v[i]、v[j]、w[i]、w[j]都是正数,所以上式成立。但是,我们知道贪心算法选择物品i和物品k的总价值一定大于选择物品i和物品j的总价值,因为: v[i]*w[k] + v[k]*w[i] > v[i]*w[j] + v[j]*w[i] 这与上式矛盾,因此假设不成立,贪心算法得到的解是最优解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值