classSolution{publicintminSubArrayLen(int target,int[] nums){int sum =0;int len =Integer.MAX_VALUE;//刚开始定义长度是int可以表示最大整数int n = nums.length;for(int left =0,right =0; right < n;right++){ sum += nums[right];//入窗口//结果判断while(sum >= target){ len =Math.min(len , right - left +1);//结果更新 sum -= nums[left++];//出窗口}}return len ==Integer.MAX_VALUE ?0: len;}}
classSolution{publicintlongestOnes(int[] nums,int k){int len =0;int n = nums.length;int count =0;//用于统计当前区间0的个数for(int left =0,right =0;right < n;right++){//记录当前0的个数if(nums[right]==0){ count++;}//出窗口while(count > k){if(nums[left++]==0){ count--;}}//更新结果 len =Math.max(len , right - left +1);}return len;}}
classSolution{publicintminOperations(int[] nums,int x){//这里采用正难则反的思想,我们是每次从最右边和最左边找数相加,看何时等于x//我们可以转换为在这个数组连续区间找一个最长的长度和为 整个数组的和 - xint sum =0;//nums整个数组的和int n = nums.length;for(int i =0; i < n;i++){ sum += nums[i];}//此时我们的目标值变成sum - xint target = sum - x;//如果全部sum和都<x说明找不到if(target <0){return-1;}int total =0;int len =-1;//后面就使用滑动窗口来找最长子串使其长度等于target目标值for(int left =0,right =0;right < n;right++){//入窗口 total += nums[right];//判断while(total > target){ total -= nums[left++];//出窗口}//等于的时候才更新结果if(total == target){ len =Math.max(len,right - left +1);}}return len ==-1?-1: n - len;}}
classSolution{publicinttotalFruit(int[] fruits){//此时我们使用一个数组来实现hashint n = fruits.length;int[] hash =newint[n+1];int len =0;//最长的长度for(int left =0,right =0,kinds =0;right < n ;right++){//入窗口if(hash[fruits[right]]==0){ kinds++;//如果这个窗口没有添加过这个元素,此时种类增多} hash[fruits[right]]++;//当kinds>2进行出窗口while(kinds >2){//出窗口 hash[fruits[left]]--;//此时如果这个连续的区间没有了这个元素,此时的种类就减小if(hash[fruits[left]]==0){ kinds--;} left++;}//更新结果 len =Math.max(len,right - left +1);}return len;}}
classSolution{publicStringminWindow(String ss,String tt){char[] s = ss.toCharArray();char[] t = tt.toCharArray();//使用数组来模拟hashint[] hash1 =newint[128];int kinds =0;//记录tt中出现字符的种类for(char ch : t){if(hash1[ch]++==0){ kinds++;}}int minlen =Integer.MAX_VALUE;int begin =-1;//记录其起始位置和长度即可int[] hash2 =newint[128];//记录窗口中字符for(int left =0, right =0, count =0; right < ss.length(); right++){char in = s[right];//当这个字符的数量和hash1相同时候,count++if(++hash2[in]== hash1[in]){ count++;}while(kinds == count){//更新结果if(right - left +1< minlen){ begin = left; minlen = right - left +1;}char out = s[left++];if(hash2[out]--== hash1[out]){ count--;}}}return begin ==-1?newString(): ss.substring(begin, begin + minlen);}}