算法思想:
1、在字符串 S 中使用双指针中的左右指针技巧,初始化 left = right = 0,把索引闭区间 [left, right] 称为一个「窗口」。
2、先不断地增加 right 指针扩大窗口 [left, right],直到窗口中的字符串符合要求。
3、此时,停止增加 right,转而不断增加 left 指针缩小窗口 [left, right],直到窗口中的字符串不再符合要求。同时,每次增加 left,都要更新一轮结果。
4、重复第 2 和第 3 步,直到 right 到达字符串 S 的尽头。
算法框架:
int left = 0, right = 0;
while (right < s.size()) {
window.add(s[right]);
right++;
while (valid) {
window.remove(s[left]);
left++;
}
}
leetcode无重复字符的最长子串
题目描述:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
class Solution {
public int lengthOfLongestSubstring(String s) {
//使用双指针的方式
int left=0;
int right=0;
int n=s.length();
int result = 0;
//记录每个字符出现的次数 里面的字符包括字母和数字,
int[] count = new int[128];
while(right<n){
//移动右指针
char c1 = s.charAt(right);
count[c1]++;
right++;
//缩小左指针
while(count[c1]>1){
char c2 = s.charAt(left);
count[c2]--;
left++;
}
result = Math.max(result,right-left);
}
return result;
}
}
leetcode长度最小的子数组
题目描述:
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int left=0;
int right=0;
int n=nums.length;
int sum = 0; //计算子数组的和
int result = n;
boolean flag = false;
int count = 0; //类似于一个标记,看看有没有出现过sum>=target
while(right<n){
sum+=nums[right]; //将nums[right]加入进来
right++;
while(sum>=target){
sum-=nums[left];
left++;
flag=true;
count++;
}
if(flag==true){
//只要当sum>=target 计算出来的子数组才有意义
left--;
sum+=nums[left];
result=Math.min(result,right-left);
}
flag=false;
}
if(count==0){
//从来没有出现过sum>=target
return 0;
}
return result;
}
}
leetcode颜色分类
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
class Solution {
public void sortColors(int[] nums) {
//0 表示红色 1 表示红白色 2 表示蓝色
/*三指针法,设立三个指针i,j,k
其中j为当前工作指针,
i以前的元素全部为红色
k以后的元素全部为蓝色
*/
int i=0;
int j=0;
int k=nums.length-1;
while(j<=k){
if(nums[j]==0){
//表示当前元素为红色 得尽量放前面
int temp = nums[i];
nums[i]=nums[j];
nums[j]=temp;
i++;
j++;
} else if(nums[j]==1){
//表示当前元素为白色 不动
j++;
} else{
//表示当前元素为蓝色 得尽量放后面
int temp = nums[k];
nums[k]=nums[j];
nums[j]=temp;
k--;
//这里没有j++ 主要防止交换后nums[j]还是为蓝色
}
}
}
}