Day66(贪心算法)

55、跳跃游戏

Day66(贪心算法)_第1张图片

题目:[2,3,1,1,4]

你站在数组的第一个元素的位置上,第一次你的跳跃范围是nums[0] 。eg:nums[0]=2 说明你可以跳在数组的索引范围为(0,2+0]的任意一个位置,如果你选择跳在索引1的位置上,那么第二次你的跳跃范围是nums[1]=3,说明接下来你可以跳跃的数组的索引范围为(1,3+1]的任意一个位置。根据你选择跳跃来判断是否能够到达最后一个下标(终点)

那我们肯定是要选能跳跃的索引范围内中元素最大的来。

第一次的跳跃范围是(0,2+0] 那么我们选择范围内最大的数值3。那么直接跳到终点

class Solution {
    public boolean canJump(int[] nums) {
        // 题目:[2,3,1,1,4]
        // 你站在数组的第一个元素的位置上,第一次你的跳跃范围是nums[0] 
        // eg:nums[0]=2 说明你可以跳在数组的索引范围为(0,2+0]的任意一个位置
        // 如果你选择跳在索引1的位置上,那么第二次你的跳跃范围是nums[1]=3
        // 说明接下来你可以条仔数组的索引范围为(1,3+1]的任意一个位置
        // 根据你选择跳跃来判断是否能够到达最后一个下标。

        //那我们肯定是要选能跳跃的索引范围内中元素最大的来。
        if(nums.length==1) return true;
        int cover=0;
        for(int i=0;i<=cover;i++){
            cover=Math.max(nums[i]+i,cover);
            if(cover>=nums.length-1){
                return true;
            }
        }
        return false;
    }
}

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

Day66(贪心算法)_第2张图片

Day66(贪心算法)_第3张图片

Day66(贪心算法)_第4张图片

从图中可以发现,其实我们需要收集每天的正利润就可以,收集正利润的区间,就是股票买卖的区间,而我们只需要关注最终利润,不需要记录区间

那么只收集正利润就是贪心所贪的地方!

局部最优:收集每天的正利润,全局最优:求得最大利润

局部最优可以推出全局最优,找不出反例,试一试贪心(如果局部最优可以推出全局最优,那就试试贪心算法,如果局部最优推不出全局最优,那就不是贪心算法

需要说明的是,在此题中:贪心算法只能用于计算最大利润,计算的过程并不是实际的交易过程。如[1,2,3,4,5],实际的交易过程并不是进行 4 次买入和 4 次卖出,而是在第 1 天买入,第 5 天卖出。

class Solution {
    public int maxProfit(int[] prices) {
        int profit=0;
        int sum=0;
        for(int i=1;i0){
                sum+=profit;
            }
        }
        return sum;
    }
}

860、柠檬水找零

Day66(贪心算法)_第5张图片

Day66(贪心算法)_第6张图片

class Solution {
    public boolean lemonadeChange(int[] bills) {
        if(bills[0]==10||bills[0]==20) return false;
        int five=1,ten=0,twenty=0;//每个金额的张数
        for(int i=1;i0){
                    five--;
                    ten++;
                }else{
                    return false;
                }
            }else if(bills[i]==20){
                if(five>0&&ten>0){
                    five--;
                    ten--;
                    twenty++;
                }else if(five>=3){//20-5=15 所以five最少要3张
                    five-=3;
                    twenty++;
                }else{
                    return false;
                }
            }
        }
        return true;
    }
}

你可能感兴趣的:(leetcode)