长度最小:
滑动窗口
public int minSubArrayLen(int target, int[] nums) { int start=0; int end=0; int res=Integer.MAX_VALUE; int sum=0; while(end<nums.length){ sum+=nums[end]; while(sum>=target){ res=Math.min(res,end-start+1); sum-=nums[start]; start++; } end++; } return res == Integer.MAX_VALUE ? 0 : res; } 满足条件的子数组有多少个?public int numSubarrayProductLessThanK(int[] nums, int k) { //同样排除k为1的情况比如 [1,1,1] k=1 if (k <= 1) { return 0; } int left = 0; int right = 0; //创建一个变量记录路上的乘积 int mul = 1; //记录连续数组的组合个数 int ans = 0;
//用右指针遍历整个数组,每次循环右指针右移一次 while(right<nums.length) { //记录乘积 mul *= nums[right]; //当大于等于k,左指针右移并把之前左指针的数除掉 while (mul >= k) { mul /= nums[left]; left++; }
//每次右指针位移到一个新位置,应该加上 x 种数组组合: // nums[right] // nums[right-1], nums[right] // nums[right-2], nums[right-1], nums[right] // nums[left], ......, nums[right-2], nums[right-1], nums[right] //共有 right - left + 1 种 ans += right - left + 1;
//右指针右移 right++; } return ans;
}
return ans;
}
最长无重复:
public int maxLength (int[] arr) { // write code here int start=0; int end=0; int res=0; while(end<arr.length){ for(int j=start;j<end;j++){ if(arr[end]==arr[j]){ res=Math.max(res,end-start); start=j+1; } } end++; } return Math.max(res,end-start);
} 标签:right,end,nums,int,res,start,滑动,窗口 From: https://www.cnblogs.com/doudou666/p/18140296