算法精选之双指针

(一)定义
双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。

(二)用法
(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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值