贪心算法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;
    }
}

你可能感兴趣的:(算法,算法,贪心算法)