1. 题目解析
Leetcode链接:1658. 将 x 减到 0 的最小操作数
这个问题的理解并不复杂,本质上是在数组中寻找值,直到将 x 减为 0。
需要注意的是,题目要求只能移除数组的最左边或最右边的值,然后返回最小的操作数。
直接从两边开始搜索可能不太容易解决问题,
我们可以将问题转化为:
寻找最长的中间子数组,这样我们就可以得到最小的操作数。
2. 算法原理
可以使用滑动窗口可以有效解决这个问题。
具体的解题思路如下:
假设数组的总和减去目标值 x 等于 target,那么目标值 target 就是中间数组的值。
我们维护一个窗口,逐步向窗口内添加元素。
如果窗口内元素的总和小于目标值 target,则继续向窗口内添加元素。
如果窗口内元素的总和等于目标值 target,则记录下操作次数。
如果窗口内元素的总和大于目标值 target,则将窗口左侧的元素移除。
3. 代码编写
class Solution {
public:
int minOperations(vector<int>& nums, int x) {
int sum = 0;
for(auto& e : nums)
sum += e;
int target = sum - x;
if(target < 0)
return -1;
int ret = -1;
for(int left = 0, right = 0, tmp = 0; right < nums.size(); right++)
{
tmp+=nums[right];
while(tmp > target)
tmp -= nums[left++];
if(target == tmp)
ret = max(ret, right - left + 1);
}
return ret == -1 ? ret : nums.size() - ret;
}
};
The Last
嗯,就是这样啦,文章到这里就结束啦,真心感谢你花时间来读。
觉得有点收获的话,不妨给我点个赞吧!
如果发现文章有啥漏洞或错误的地方,欢迎私信我或者在评论里提醒一声~