对于可排序或者有序的数组来说,减少时间复杂度的算法常用双指针。通过双指针维护一段符合条件的数组部分。
双指针的走向
一般分为两种
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;
};