1. 题目解析
题目链接:1658. 将 x 减到 0 的最小操作数 - 力扣(Leetcode)
这道题并不难理解,其实就是在数组里找值,直到把x减成0,
这里要注意的是,题目要求移除的之能是数组最左边或者最右边的值,
然后返回最小的操作数即可。
如果直接从两边去找可能不太好解决,
我们可以把这个问题转化成:
找出最长的中间子数组,这样我们就能得到最小的操作数了。
2. 算法原理
这道题可以用滑动窗口来解决,
具体思路是这样的:
数组的总和 - x = target ,这个target值就是中间数组的值,
我们维护一个窗口,不断往窗口里面进值,
如果窗口总值 < target,就继续进窗口
如果 == target,那就记录操作次数,
如果 > target, 就出窗口。
来看代码:
3. 代码编写
class Solution { public: int minOperations(vector<int>& nums, int x) { int left = 0, right = 0, sum = 0, len = INT_MAX, target = -x; for(auto e : nums) target += e; if(target < 0) return -1; int n = nums.size(); while(right < n) { sum += nums[right++]; while(left < n && sum > target) sum -= nums[left++]; if(sum == target) len = min(len, n - (right - left)); } return len == INT_MAX ? -1 : len; } };
写在最后:
以上就是本篇文章的内容了,感谢你的阅读。
如果感到有所收获的话可以给博主点一个赞哦。
如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~