leetcode 1658 将x减到0的最小操作数
一、题目描述
二、解题思路
整体思路:
先求出数组中所有元素的和,减去x的值得到target,借助滑动窗口思想,求解出和为target的最长连续子串的长度,用数组的长度减去和为target的最长连续子串的长度,即为所求。
具体思路:
(1)求出数组中所有元素的和,算出target;
(2)处理边界情况,如果target为负数,表示sum<x,不合法,返回-1。如果target等于0,表示sum=x,直接返回n;
(3)借助滑动窗口思想,记录和为target的最长连续子串的长度;
<1>进窗口
//进窗口
sum+=nums[right];
<2>出窗口
//出窗口
while(sum>target){
sum-=nums[left++];
}
<3>更新
//更新
if(sum==target) w_length=max(w_length,right-left+1);
(4)最后返回最小操作数。
三、代码实现
class Solution {
public:int minOperations(vector<int>& nums, int x) {int left,right,n=nums.size();int w_length=0;long long sum=0,target;//求所有元素的和,继而求出窗口targetfor(int i:nums) sum+=i;target=sum-x;//边界处理if(target<0) return -1;if(target==0) return n;//和为target的最长连续子串(滑动窗口)sum=0;for(left=0,right=0;right!=n;right++){//进窗口sum+=nums[right];//出窗口while(sum>target){sum-=nums[left++];}//更新if(sum==target) w_length=max(w_length,right-left+1);}return w_length==0?-1:(n-w_length);}
};