双指针算法

90 阅读1分钟

对于可排序或者有序的数组来说,减少时间复杂度的算法常用双指针。通过双指针维护一段符合条件的数组部分。

双指针的走向

一般分为两种

1、

i = 0, j = n - 1;

然后i与j根据不同情况往中间靠拢

2、

i = 0, j = 0;
for (int i = 0, j = 0; i < n; i ++) {
    while (...) j ++;
    ...
}

维护一段符合条件的数组部分

典型的双指针算法题 leetcode 15. 三数之和

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function(nums) {
    let res = [];
    let len = nums.length;
    nums.sort((a, b) => a - b);
    for (let i = 0; i < len; i ++) {
        if (i && nums[i] == nums[i - 1]) continue;
        for (let j = i + 1, k = len - 1; j < k; j ++) {
            if (j > i + 1 && nums[j] == nums[j - 1]) continue;
            while (j < k - 1 && nums[i] + nums[j] + nums[k - 1] >= 0) k --;
            if (nums[i] + nums[j] + nums[k] == 0) res.push([nums[i], nums[j], nums[k]]);
        }
    }

    return res;
};