算法学习/总结 —— 数组

105 阅读1分钟

数组

二分查找

基本实现流程;

需要设置最开始的前后指针

每次找到这两个指针的中间值 判断中间值是否满足情况

根据中间值的情况 反应到前后指针的修改

伪代码

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 = 0while() {
    if() {
        i++
        j++
    }
    else if() {
        i++
    }
    else {
        j++
    }
}

滑动窗口

基本概念: 类似于计算机网络的滑动窗口 设置前后指针 每次保持后指针不断向前 当满足某钟情况下 保持后指针不动 移动前指针向前 直到某种条件被重新触发

伪代码:

let left = right = 0
while(right < n) {
    right++
    if(/* 某种临界条件被触发后 */) {
        /* 清除left删除带来的影响 */
        left++
    }
}
return