题目描述
给你一个整数数组 nums 和一个整数 x 。每一次操作时,你应当移除数组 nums 最左边或最右边的元素,然后从 x 中减去该元素的值。请注意,需要 修改 数组以供接下来的操作使用。
如果可以将 x 恰好 减到 0 ,返回 最小操作数 ;否则,返回 -1 。
示例 1:
输入:nums = [1,1,4,2,3], x = 5
输出:2
解释:最佳解决方案是移除后两个元素,将 x 减到 0 。
示例 2:
输入:nums = [5,6,7,8,9], x = 4
输出:-1
示例 3:
输入:nums = [3,2,20,1,1,3], x = 10
输出:5
解释:最佳解决方案是移除后三个元素和前两个元素(总共 5 次操作),将 x 减到 0 。
提示:
1 <= nums.length <= 105
1 <= nums[i] <= 104
1 <= x <= 109
求解思路
- 如果题目中给定的操作需要我们对数组前后不断操作的,使用滑动窗口即可进行求解
- 改题目转化为,在数组中找到一个窗口,使得数组和sum-窗口内和==x
实现代码
class Solution {
public int minOperations(int[] nums, int x) {
int sum = 0, min = Integer.MAX_VALUE;
for(int i : nums){
sum += i;
min = Math.min(min,i);
}
//如果最小值都大于x或者总和小于x不符合
if(min > x || sum < x) return -1;
int n = nums.length;
if(sum == x) return n;
int maxL = 0;
int l = 0, r = 0;
while(r < n){
sum -= nums[r];
while(sum < x){
sum += nums[l++];
}
if(sum == x){
// System.out.println(r+"---"+l);
maxL = Math.max(maxL,r + 1 - l);
}
r++;
}
return maxL == 0 ? -1 : n - maxL;
}
}
运行结果

该文章介绍了一种使用滑动窗口解决数组操作的问题,目标是找到数组中的一个子集,通过移除元素使给定的数值x减到0。如果可能,返回最小的操作数;否则返回-1。提供的代码示例展示了如何通过维护窗口的和来找到满足条件的子集。
472

被折叠的 条评论
为什么被折叠?



