滑动窗口的解题思路
题一:无重复字符的最长子串
class Solution { public int lengthOfLongestSubstring(String s) { if (s.length()==0) return 0; HashMap<Character, Integer> map = new HashMap<Character, Integer>(); int max = 0; int left = 0; for(int i = 0; i < s.length(); i ++){ // 如果已经存在当前元素,移动左窗口的值 if(map.containsKey(s.charAt(i))){ left = Math.max(left,map.get(s.charAt(i)) + 1); } // 更新索引值 map.put(s.charAt(i),i); max = Math.max(max,i-left+1); } return max; } }
题二:长度最小的子数组
class Solution { public int minSubArrayLen(int s, int[] nums) { int i = 0; int sum = 0; int len = 0; for (int j = 0; j < nums.length; j++) { sum += nums[j]; while (sum >= s) { len = len == 0 ? j - i + 1 : Math.min(len, j - i + 1); sum -= nums[i++]; } } return len; } }