代码随想录Day32

Day 32 贪心算法 Part03

今日任务

  • 1005.K次取反后最大化的数组和
    1. 加油站
    1. 分发糖果

代码实现

1005.K次取反后最大化的数组和
这题有点思路,和题解也差不多,但是没完全通,感觉很复杂,无法下手

    public int largestSumAfterKNegations(int[] nums, int k) {

        nums = IntStream.of(nums).boxed().sorted((a, b) -> Math.abs(b) - Math.abs(a)).mapToInt(Integer::intValue).toArray();
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] < 0 && k > 0) {
                nums[i] = -nums[i];
                k--;
            }
        }
        if (k % 2 == 1) {
            nums[nums.length - 1] = - nums[nums.length - 1];
        }
        return Arrays.stream(nums).sum();

    }
  1. 加油站
    这题也是有点思路,有两个问题需要想明白,第一,当totalSum>0的时候,此题一定有解;第二,当currentSum<0的时候,current之前的起始点一定是行不通的;我也想到最大子数组的这种方法,就是第一点没想明白,无法下手
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int start = 0;
        int currentSum = 0;
        int totalSum = 0;
        for (int i = 0; i < gas.length; i++) {
            currentSum+=(gas[i] - cost[i]);
            totalSum+=(gas[i] - cost[i]);
            if (currentSum < 0) {
                start = i + 1;
                currentSum = 0;
            }
        }
        if (totalSum < 0) return -1;
        return start;
    }
  1. 分发糖果
    完全想不出来的题
    public int candy(int[] ratings) {

        int[] candy = new int[ratings.length];
        candy[0] = 1;
        for (int i = 1; i < ratings.length; i++) {
            if (ratings[i] > ratings[i - 1]) {
                candy[i] = candy[i - 1] + 1;
            } else {
                candy[i] = 1;
            }
        }
        for (int i = ratings.length - 2; i >= 0; i--) {
            if (ratings[i] > ratings[i + 1]) {
                candy[i] = Math.max(candy[i + 1] + 1, candy[i]);
            }
        }
        return Arrays.stream(candy).sum();
    }

今日总结

  1. 脑子有点混沌,贪心就是各玩各的,很多就是理解问题
  2. 还差得远
  3. 今天果然不出所料是一个大跌,并且跌势没有减缓的情况下明天还是一个跌
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值