代码随想录-Day33-贪心算法-LetCode1005. K 次取反后最大化的数组和||134. 加油站||135. 分发糖果

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

给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:

  • 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。

重复这个过程恰好 k 次。可以多次选择同一个下标 i 。

以这种方式修改数组后,返回数组 可能的最大和 。

贪心思路:

        将数组排序,先将所有的负数翻转,如果此时还存在k这时候根据贪心策略,再次将数组排序,将最小的进行翻转即可。

        如果k结束了,但是还存在负数,不需要处理

class Solution {
    public int largestSumAfterKNegations(int[] nums, int k) {
        int min=200;
        int index=0;
        int result=0;
        Arrays.sort(nums);
        
        for(int i=0;i<nums.length;i++){
            if(nums[i]<0&&k>0){
                nums[i]=-1*nums[i];
                k--;
            }else{
                break;
            }
        }
        if(k!=0){
            Arrays.sort(nums);
            if(k%2==1) nums[0]=-1*nums[0];
        }
        
        for(int i=0;i<nums.length;i++){
            result+=nums[i];
        }
        return  result;
    }
}

134. 加油站

在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。

你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。

给定两个整数数组 gas 和 cost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。

贪心策略:

        整体思路:获得的所有油如果小于小消耗的,直接返回-1,不可能跑完一圈

        贪心策略,获得的油和消耗的油只差为整数,并且尽可能多的从获取这种差为正数的加油站开始,实现方式,定义两个和,一个记录总和,用于最终判断,另一个记录便利过程中的局部和,如果局部和小于0说明从开始节点到当前节点,无论从哪一个出发,最终都会没油,所以不需要进行类加了,直接跟新开始节点即可。遍历完最终判断即可。

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int max=-10000000;
        int start=0;
        int sum=0;
        int startsum=0;
        for(int i=0;i<gas.length;i++){
            int temp=gas[i]-cost[i];
            sum+=temp;
            startsum+=temp;
            if(startsum<0){
                start=i+1;
                startsum=0;
            }
        }
        if(sum<0) return -1;
        else return start;
    }
}

n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。

你需要按照以下要求,给这些孩子分发糖果:

  • 每个孩子至少分配到 1 个糖果。
  • 相邻两个孩子评分更高的孩子会获得更多的糖果。

请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 

贪心策略:

        采用两次的贪心步骤,先给每一个孩子一颗糖,在分两次判断积分高低,保证局部最优,进而得到全局最优

        

class Solution {
    public int candy(int[] ratings) {
        //使用两次贪心的思路,给每一个孩子都一个谈过,设立两个条件
        //先满足左条件,在满足右条件,最终返回最终结果
        int[] candySum=new int[ratings.length];
        candySum[0]=1;
        //先给每个孩子都一个糖果,并且保证有孩子的评分大于左孩子
        for(int i=1;i<ratings.length;i++){
            candySum[i]=(ratings[i]>ratings[i-1])? candySum[i-1]+1:1;
        }
        for(int i=ratings.length-2;i>=0;i--){
           if (ratings[i] > ratings[i + 1]) {
                candySum[i] = Math.max(candySum[i], candySum[i + 1] + 1);
            }
        }
        int ans = 0;
        for (int num : candySum) {
            ans += num;
        }
        return ans;

    }
}

                                                                                                                                By三体直线围墙

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值