滑动窗口算法可以用以解决数组/字符串的子元素问题,它可以将嵌套的循环问题,转换为单循环问题,降低时间复杂度, 算法包涵一个可以移动的左右指针.
1) 长度为k的连续子数组最大的和
/**
* 长度为k的连续子数组的最大和 //滑动窗口法
* @param arr
* @param k
* @return
*/
public static int maxSumSub(int[] arr,int k){
if(arr.length<k){
return -1;
}
int sum =0;
//第一个窗口的和
for(int i=0;i<k;i++){
sum+=arr[i];
}
int maxSum =sum ;
int left =1;
int right =left+k-1;
while(right<arr.length){
sum = sum-arr[left-1]+arr[right];
maxSum = Math.max(maxSum, sum);
left++;
right++;
}
return maxSum;
}
2) 最长的无重复子串
/**
* 无重复的最长子串,滑动窗口法, 比如abcada,返回4
* @param s
* @return
*/
public static int getMaxNoRepeatSubStrLen(String s){
if(s==null||s.length()==0){
return 0;
}
HashMap<Character,Integer> map = new HashMap<>();
int maxLen = 0;
int left =0;
int right =0;
while(right<s.length()){
if(!map.containsKey(s.charAt(right))){
maxLen = Math.max(maxLen, right-left+1);
}else{
//移动left
left = map.get(s.charAt(right))+1;
}
map.put(s.charAt(right), right);
//始终移动right
right++;
}
return maxLen;
}