Day66(贪心算法)

55、跳跃游戏

题目:[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 

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

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

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

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

需要说明的是,在此题中:贪心算法只能用于计算最大利润,计算的过程并不是实际的交易过程。如[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;i<prices.length;i++){
            profit=prices[i]-prices[i-1];
            if(profit>0){
                sum+=profit;
            }
        }
        return sum;
    }
}

860、柠檬水找零

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;i<bills.length;i++){
            if(bills[i]==5){
                five++;
            }else if(bills[i]==10){
                if(five>0){
                    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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值