目录


- public int minSubArrayLen(int target,int[]nums) {
- int n= nums.length,len=Integer.MAX_VALUE,sum=0;
- 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];
- left++;//出窗口
- }
- }
- return len==Integer.MAX_VALUE?0:len;
- }

在找到超过反转个数的right位置时,left不用走一步就更新一次,因为在刚找到的那个位置的长度一定比left往后面一步一步走的长度长(例1比例2长)


- public int longestOnes(int[] nums, int k) {
- int n=nums.length,zero=0,len=0;
- for (int right = 0,left=0; right < n; right++) {
- if(nums[right]==0) zero++;//进窗口
- while (zero>k){//判断
- if(nums[left]==0) zero--;//出窗口
- left++;
- }
- len=Math.max(len,right-left+1);
- }
- return len;
- }



- public int minOperations(int[] nums, int x) {
- int sum=0;
- int n=nums.length;
- int len=-1;
- for (int i : nums) sum+=i;
- int target=sum-x;
- // 如果x的值大于所有数之和,直接返回-1
- if(target<0) return -1;
- for (int right = 0,left=0,temp=0; right < n ; right++) {
- temp+=nums[right];//进窗口
- while (temp>target){//判断
- temp-=nums[left];
- left++;//出窗口
- }
- if(temp==target){
- len=Math.max(len,right-left+1);//更新结果
- }
- }
- if(len==-1) return len;
- else return n-len;
- }