二分搜索算法:
二分搜索算法的思路很简单,但是细节比较烦人。
二分搜索框架:
int binarySearch(int[] nums, int target)
{
int left = 0, right = ……;
while(……){
int mid = left + (right - left) / 2;
if(nums[mid] == target){
……
}else if(nums[mid] < target){
left = ……;
}else if(nums[mid] > target){
right = ……;
}
}
return ……;
}
二分查找算法的基础常用场景:
1.寻找一个数;
2.寻找左侧(右侧)边界
主要有两种算法细节区别:1.right = nums.length - 1; 2.right = nums.length;
对应的循环截止条件有区别:left <= right; left < right.因为对应的运算空间不同:一个是两边都闭合,一个是左闭右开。
滑动窗口算法:
基本框架:
void sildingWindow(string s, string t){
unordered_map<char, int> need, window;
for(char c : t) need[c]++;
int left = 0, right = 0;
int valid = 0;
while(right < s.size()){
//c是将移入窗口的字符
char c = s[right];
//右移窗口
right++;
//进行窗口内数据的一系列更新
……
/* debug输出的位置 */
printf("window: [ %d, %d]\n,left,right");
//判断左侧窗口是否要收缩
while(window needs shrink){
//d是将要移出的字符
char d = s[left];
//左移窗口
left++;
//进行窗口内数据的一系列更新
……
}
}
}
常用解决场景:
1.最小覆盖子串;
2.字符串排列;
3.找出所有字母异位词;(所谓的字母异位词,其实就是全排列);
4.最长无重复子串。