代码随想录训练营day34|1005.K次取反后最大化数组的和、134.加油站、135.分发糖果

class Solution {
    public int largestSumAfterKNegations(int[] nums, int k) {
        // 局部最优每次都将最小的取反,
        // 这里写的比较冗余
        int sum = 0;
        
        for(int i=0;i<k;i++){
            int min = Integer.MAX_VALUE;
            for(int j=0;j<nums.length;j++){
                if(min >= nums[j]){
                    min = nums[j];
                }
            }
            for(int l=0;l<nums.length;l++){
                if(min == nums[l]){
                    nums[l] = -min;
                    break;
                }
            }
        }
        for(int i=0;i<nums.length;i++){
            sum+=nums[i];
        }
        return sum;
    }
}

代码随想录的方法:先排序,然后遍历到k将负数变成正数

LeetCode134加油站

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        // 当cursum<0时,表示目前走的路已经断了,只能从当前i的下一个(i+1)开始

        int curSum = 0;
        int totalSum = 0;
        int ans = 0;
        for(int i=0;i<gas.length;i++){
            curSum += gas[i] - cost[i]; // 记录当前的sum是不是小于0 
            totalSum += gas[i] - cost[i]; // 记录总的gas和cost大小,如果小于0直接返回-1.
            if(curSum < 0){
                ans = i+1; // 循环数组,对于最后一个数的时候 他的下一个就是i+1要特殊处理。但是这里不加也可以,因为如果第一个位置要作为其实未知的话,直接就在第一步就判断出来了,不会执行到最后一步。  
                curSum = 0;

            }
        }
        if(totalSum <0){
            return -1;
        }
        return ans;
    }
}

LeetCode135:分发糖果

class Solution {
    public int candy(int[] ratings) {
        // 分为两步,
        // 从左向右遍历:得到左边小于右边的
        // 之后在从右向左遍历:得到左边大于右边的
        int[] ans = new int[ratings.length];
        int min = Integer.MAX_VALUE;
        ans[0] = 1;
        for(int i=1;i<ratings.length;i++){
            if(ratings[i]>ratings[i-1]){
                ans[i] = ans[i-1]+1;
            }
            else{
                ans[i] = 1;
            }
        }
        for(int i=ratings.length-1;i>0;i--){
            if(ratings[i-1]>ratings[i]){
                ans[i-1] = Math.max(ans[i]+1, ans[i-1]);
            }
        }
        int result=0;
        for(int i=0;i<ans.length;i++){
            result += ans[i];
        }
        return result;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值