intLengthOfLongestSubstring(string s){int n = s.size();int ret =0;int hash[128]={0};// 利用hash查重for(int left =0, right =0; right < n; right++){
hash[s[right]]++;// 入窗口while(hash[s[right]]>1){
hash[s[left++]]--;// 出窗口}
ret =max(ret, right - left +1);// 更新结果}return ret;}
intLongestOnes(vector<int>& nums,int k){// 问题转化为,子数组内,0的个数不超过kint ret =0;for(int left =0, right =0, zero =0; right < nums.size(); right++){if(nums[right]==0){
zero++;// 入窗口}while(zero > k){if(nums[left++]==0){
zero--;}}
ret =max(ret, right - left +1);}return ret;}
初始化左右指针left = 0, right = 0(滑动窗⼝区间表⽰为 [ l , r ) [l, r) [l,r)
左右区间是否开闭很重要,必须设定与代码⼀致
记录当前滑动窗⼝内数组和的变量sum = 0
记录当前满⾜条件数组的最⼤区间⻓度len = -1
当right < nums.size()时,⼀直循环:
if sum < target
right++,直⾄sum >= target ,或right已经移到头
if sum > target
left++,直⾄sum <= target ,或left已经移到头
如果经过前两步的左右移动使得sum == target
维护满⾜条件数组的最⼤⻓度,并让下个元素进⼊窗⼝
3.代码实现
intMinOperations(vector<int>& nums,int x){// 将模型转化为最长子数组的和 == (sumNum - x)int sum =0, ret =-1;int target =-x;for(auto& e : nums){
target += e;}// 细节处理,当target为负数时,怎么减都减不够if(target <0){return-1;}for(int left =0, right =0; right < nums.size(); right++){
sum += nums[right];// 入窗口while(sum > target)// 判断{
sum -= nums[left++];// 出窗口}if(sum == target){
ret =max(ret, right - left +1);// 更新结果}}return ret ==-1?-1: nums.size()- ret;}