34-贪心算法-1005.K次取反后最大化的数组和 134.加油站 135.分发糖果

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

给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。)
以这种方式修改数组后,返回数组可能的最大和。

思路:排序后遍历数组,先把绝对值大的负数修改为正的,如果次数没有用完的话,选择一个绝对值最小的正数变为负数。实现方式各有不同。

class Solution {
    public int largestSumAfterKNegations(int[] nums, int k) {
        Arrays.sort(nums);
        int temp = 0;
        for(int i = 0; i < nums.length; i++){
            if(nums[i] < 0 && k > 0){
                nums[i] = - nums[i];
                k --;
                temp = i;
            }
        }
        int index = 0;
        if(k % 2 == 1){
            if(temp < nums.length - 1){
                index = Math.abs(nums[temp]) > Math.abs(nums[temp + 1]) ? temp + 1 : temp;
            }else{
                index = temp;
            }
            nums[index] = - nums[index]; 
        }
        int result = 0;
        for(int i = 0; i < nums.length; i ++){
            result += nums[i];
        }
        return result;
    }
}

134.加油站

思路:从0开始遍历,一旦发现途经数值的和小于零,则这几个数值都不能作为开始,curSum清零,start变为i + 1。直到结束,如果总和小于零则不能完成,否则返回记录的start值。
方法二:记录minSum,倒序遍历看到那个位置能把空缺填上,返回。

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int totalSum = 0;
        int curSum = 0;
        int start = 0;
        for(int i = 0; i < gas.length; i++){
            totalSum += gas[i] - cost[i];
            curSum += gas[i] - cost[i];
            if(curSum < 0){
                start = (i + 1) % gas.length;
                curSum = 0;
            }
        }
        if(totalSum < 0)
            return -1;
        return start;
    }
}

135.分发糖果

老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。
你需要按照以下要求,帮助老师给这些孩子分发糖果:

  • 每个孩子至少分配到 1 个糖果。
  • 相邻的孩子中,评分高的孩子必须获得更多的糖果。
  • 那么这样下来,老师至少需要准备多少颗糖果呢?

思路:从左到右遍历,右侧数值大的多给糖果,再从右到左遍历,左边大的多给并计算和左侧遍历相比谁更大。
注意:第一次运行出现错误:

  • 第二次遍历是i - -,不要顺手习惯+ +
  • length单词拼写错误
class Solution {
    public int candy(int[] ratings) {
        int len = ratings.length;
        int[] candy = new int[len];
        candy[0] = 1;
        for(int i = 0; i < len - 1; i ++){
            if(ratings[i] < ratings[i + 1]){
                candy[i + 1] = candy[i] + 1;
            } else{
                candy[i + 1] = 1;
            }
        }
        for(int i = len - 1; i > 0; i --){
            if(ratings[i] < ratings[i - 1]){
                candy[i - 1] = Math.max(candy[i] + 1, candy[i - 1]);
            }
        }
        int res = 0;
        for(int i = 0; i < len; i ++){
            res += candy[i];
        }
        return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值