数组
二分查找
基本实现流程;
需要设置最开始的前后指针
每次找到这两个指针的中间值 判断中间值是否满足情况
根据中间值的情况 反应到前后指针的修改
伪代码
let low = 0, high = n;
while(left <= right) {
let m = Math.floor((high - low) / 2);
if(nums[m]) {
/* 满足情况上的选取 */
}
else if() {
high = m - 1
}
else {
low = m + 1
}
}
双指针
一般有三种情况: 对碰指针 快慢指针 分离指针
区别:
对碰指针
基本概念: 前后两个指针left right 指向第一个 和 最后一个, 然后前指针 left 不断向前 后指针 right 不断后退 直到碰撞为止。
伪代码:
let left = 0, right = n
while(left < right) {
if(/* 满足情况 */) {
return ;
}
else if() {
right--
}
else {
left++
}
}
return /* 不满足情况 */
快慢指针
基本概念:顾名思义 即是有两个指针 一快一慢 形成一种相互追赶的感觉
伪代码:
let slow = o, fast = 1
while() {
if(/* 满足情况 */) {
slow++
}
fast++
}
return slow
分离指针
基本概念: 两个指针是在不同的结构上跑的(如两个数组等
伪代码:
let i = 0
let j = 0
while() {
if() {
i++
j++
}
else if() {
i++
}
else {
j++
}
}
滑动窗口
基本概念: 类似于计算机网络的滑动窗口 设置前后指针 每次保持后指针不断向前 当满足某钟情况下 保持后指针不动 移动前指针向前 直到某种条件被重新触发
伪代码:
let left = right = 0
while(right < n) {
right++
if(/* 某种临界条件被触发后 */) {
/* 清除left删除带来的影响 */
left++
}
}
return