形成目标的子数组的最少增加次数
给你一个整数数组 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;
}
}
总结
目前我只会暴力解,所以到最后一个用例时间超了,但这是我刷的第一道困难题,就稍微放宽一下对自己的要求。