长度最小:
滑动窗口
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);
}
最长无重复:
public int lengthOfLongestSubstring(String s) {
if(s.length()==0){
return 0;
}
if(s.length()==1){
return 1;
}
int left=0;
int right=1;
int res=0;
while(right<s.length()){
for(int i=left;i<right;i++){
if(s.charAt(i)==s.charAt(right)){
res=Math.max(res,right-left);
left=i+1;
}
}
right++;
}
return Math.max(res,right-left);
}