118
社区成员




class Solution {
public int minOperations(int[] nums, int x) {
// 计算数组的总和
int totalSum = 0;
for (int num : nums) {
totalSum += num;
}
// 目标值:总和减去x
int target = totalSum - x;
// 如果目标值为负,无法通过移除元素使x减为0
if (target < 0) {
return -1;
}
// 如果目标值为0,说明需要移除所有元素
if (target == 0) {
return nums.length;
}
// 初始化变量:最大子数组长度、当前窗口和、窗口左边界
int maxLen = -1;
int currentSum = 0;
int left = 0;
// 滑动窗口右边界
for (int right = 0; right < nums.length; right++) {
// 扩展窗口,累加当前元素
currentSum += nums[right];
// 当窗口和超过目标值时,收缩左边界
while (currentSum > target && left <= right) {
currentSum -= nums[left];
left++;
}
// 如果当前窗口和等于目标值,记录最大长度
if (currentSum == target) {
maxLen = Math.max(maxLen, right - left + 1);
}
}
// 如果找到了符合条件的子数组,返回移除元素的最小次数
// 否则返回-1
return maxLen != -1 ? nums.length - maxLen : -1;
}
}
totalSum
。target = totalSum - x
。如果target
为负,直接返回 - 1;如果target
为 0,直接返回数组长度。left
和right
表示窗口的左右边界,currentSum
记录当前窗口的和,maxLen
记录符合条件的最长子数组长度。right
不断右移,累加元素到currentSum
。currentSum > target
时,左边界left
右移,减小currentSum
。currentSum == target
时,更新maxLen
为当前窗口长度和之前记录的最大值中的较大值。