23.4.29 每日一道LeetCode

形成目标的子数组的最少增加次数

给你一个整数数组 target 和一个数组 initial ,initial 数组与 target  数组有同样的维度,且一开始全部为 0 。

请你返回从 initial 得到  target 的最少操作次数,每次操作需遵循以下规则:

在 initial 中选择 任意 子数组,并将子数组中每个元素增加 1 。
答案保证在 32 位有符号整数以内。

Java暴力解:        

public static int minNumberOperations(int[] target) {
        int[] initial = new int[target.length];// 初始化数组
        int count = 0;
        for (int j = 0; j < target.length;) {
            if (initial[j] < target[j]) {// 如果初始化数组小于目标数组
                for (int i = j; i < target.length; i++) {// 从j开始遍历连续小于目标数组的数
                    if (initial[i] == target[i]) {// 如果碰到相等的数就退出
                        break;
                    }
                    initial[i]++;// 初始化数组+1
                }
                count++;// 计次+1
            } else if (j == target.length - 1) { // 防止数组越界
                break;
            } else{// 如果初始化数组等于目标数组并且没有越界,那么循环往下走,j+1
                j++;
            }
        }
        return count;
}

Go暴力解:

        放弃,我连初始化数组都初始化不了,太怪了。

差分法(Java):

public int minNumberOperations(int[] target) {
        int[] diffs = new int[target.length];
            int sum = target[0];
            diffs[0] = target[0];
            for (int i = 1; i < target.length; ++i) {
                diffs[i] = target[i] - target[i - 1];
                if (diffs[i] > 0) { // 如果存在增加操作
                    sum += diffs[i]; // 直接增加对应的差分值
                }
            }
            return sum;
    }

标准答案(Java):

        太牛辣,完全想不到这么简单的方法!!!!

class Solution {
    public int minNumberOperations(int[] target) {
        int res = target[0];
        for (int i = 1; i < target.length; i++) {
            res += Math.max(target[i] - target[i-1], 0);
        }
        return res;
    }
}

总结

        目前我只会暴力解,所以到最后一个用例时间超了,但这是我刷的第一道困难题,就稍微放宽一下对自己的要求。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值