(一)定义
双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。
(二)用法
(1)对撞指针 适用于有序数组,也就是说当你遇到题目给定有序数组时,应该第一时间想到用对撞指针解题。
例题:给定两个有序数组,把两个数组合并为一个。 输入输出样例 输入是两个数组和它们分别的长度 m 和 n。其中第一个数组的长度被延长至 m + n,多出的 n 位被 0 填补。题目要求把第二个数组归并到第一个数组上,不需要开辟额外空间。 Input: nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 Output: nums1 = [1,2,2,3,5,6]
<script>
var nums1 = [1, 2, 3, 0, 0, 0],
m = 3,
nums2 = [2, 5, 6],
n = 3;
// 方法一:
// function getArray(nums1, m, nums2, n) {
// nums1.splice(m, nums1.length - m, ...nums2);
// nums1.sort(function(a, b) {
// return a - b;
// });
// return nums1;
// }
// var newArray = getArray(nums1, m, nums2, n);
// console.log(newArray);
//方法二:双指针
function getArray(nums1, m, nums2, n) {
while (n > 0) {
let k = m + n - 1;
if (nums1[m - 1] > nums2[n - 1]) {
nums1[k] = nums1[m - 1];
m--;
} else {
nums1[k] = nums2[n - 1];
n--;
}
}
return nums1;
}
var arr = getArray(nums1, m, nums2, n);
console.log(arr);
</script>
(2)快慢指针 也是双指针,但是两个指针从同一侧开始遍历数组,将这两个指针分别定义为快指针(fast)
和慢指针(slow)
,两个指针以不同的策略移动,直到两个指针的值相等(或其他特殊条件)为止。
例题: 在一个增序的整数数组里找到两个数,使它们的和为给定值。已知有且只有一对解。 输入输出样例: 输入是一个数组(numbers)和一个给定值(target)。 输出是两个数的位置,从 1 开始计数。 Input: numbers = [2,7,11,15], target = 9 Output: [1,2]
<script>
function countNumber(arr, target) {
// 方法:用一个空数组来储存两个相加值为target的,因为可能存在多种情况
// 思路:遍历数组,判断是否有值arr[j]和target-arr[i]相等,如果有,就说明这两个数是我们要找的
let list = [];
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[j] == target - arr[i]) {
list.push(i + 1, j + 1);
}
}
}
return list;
}
let arr = [2, 7, 11, 15],
num = 9;
let list = countNumber(arr, num);
console.log(list);
</script>