题目链接:1658. 将 x 减到 0 的最小操作数 - 力扣(LeetCode)
知道滑动窗口,代码却写不出来
#define MIN(a ,b) ((a) < (b) ? (a) : (b))int minOperations(int* nums, int numsSize, int x)
{int ans = INT_MAX;int sum = 0;for (int i = 0; i < numsSize; i++) {sum += nums[i];}if (sum < x) {return -1;}int left = -1;int right = 0;int lsum = 0; // left为-1,左边数组为空,前缀和为0int rsum = sum; // right为0,右边选中整个数组,后缀和为数组和sumwhile (left < numsSize) {if (left != -1) {lsum += nums[left]; // 更新前缀和}while (right < numsSize && lsum + rsum > x) {rsum -= nums[right++]; // 前缀和后缀和相加大于x,缩小右数组}if (lsum + rsum == x) {ans = MIN(ans, left + 1 + numsSize - right); // 更新最小操作数}left++;}return ans == INT_MAX ? -1 : ans;
}