1、 长度最小的子数组 - 力扣(LeetCode)
思路:
- 首先在暴力枚举的方法下,我们可以进行优化,让right不用从头开始,只需让left移动,进行判断。
- 然后就是变成了同向双指针,也就是滑动窗口。
- right向右移动,同时记录下sum 的值,直到sum >= target
- 然后left右移,继续判断
-
代码:
public int minSubArrayLen(int target, int[] nums) {
int n = nums.length;
int minLen = Integer.MAX_VALUE;
int sum = 0;
for(int left = 0, right = 0; right < n; right++){
//进窗口
sum += nums[right];
//连续判断
while(sum >= target){
//更新最小长度
minLen = Math.min(minLen,right - left +1);
//滑出窗口
sum -= nums[left++];
}
}
return minLen == Integer.MAX_VALUE ? 0 : minLen;
}
2、无重复字符的最长子串 - 力扣(LeetCode)
解法一:暴力枚举
- 先固定一个left,让right向右遍历
- 遇到重复的字符,让left加一
- 然后right返回,重新遍历
解法二: 滑动窗口(在解法一的基础上进行优化)
- 还是先固定一个left在起始位置,让right从起始位置开始向后遍历
- 每遍历一个字符的时候,将该字符放入哈希表中(进窗口)
- 当窗口内出现重复字符的时候,让left++,并且删掉left位置的值(出窗口),然后right继续向后走
- 最后出完窗口更新一下最大值
代码:
class Solution {
public int lengthOfLongestSubstring(String ss) {
char[] s = ss.toCharArray();
int n = s.length;
int ret = 0;
int[] hash = new int[128];
for(int left = 0, right = 0; right < n; right++){
hash[s[r