题目:
算法分析:
可以看出,这道题本意是从计算两侧和为x 的数字, 要求数量最少,
那我们可以反向思考, 假如整个数组的和为sum, 那么我们就可以求中间部分和为sum-x的数字(当然必须连续), 当中间部分的数字同时达到和为sum-x以及长度最长两个要求时, 两侧数字也就达到了和为x以及数量最少的要求.
令中间部分求和结果为target
此时我们发现 这正好是滑动窗口的解法
代码:
class Solution {
public int minOperations(int[] nums, int x) {
// int left = 0, right = 0, len = 0, sum = 0, allAdd = 0;
// for(int i = 0; i < nums.length; i++) {
// allAdd += nums[i];
// }
// if(allAdd == x)
// return nums.length;
// while(right < nums.length) {
// sum += nums[right];
// while(sum >= allAdd - x && left < nums.length) {
// if(sum == allAdd - x) {
// len = Math.max(len, right - left + 1);
// }
// sum -= nums[left];
// left++;
// }
// right++;
// }
// return len > 0 ? nums.length - len : -1;
int sum = 0;
for(int a : nums) sum += a;
int target = sum - x;
if(target < 0) return -1;
int ret = -1;
for(int left = 0, right = 0, tmp = 0; right < nums.length; right++) {
tmp += nums[right];
while(tmp > target) {
tmp -= nums[left++];
}
if(tmp == target) {
ret = Math.max(ret, right - left + 1);
}
}
if(ret == -1) {
return -1;
}else {
return nums.length - ret;
}
}
}
结果: