双指针算法题目

172 阅读2分钟

双指针算法题

什么时候使用双指针

字眼:在原来的修改,不使用额外空间,相对顺序不变,

例题:

在有序的数组中删除重复项

给你一个 升序排列 的数组 nums ,请你原地删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序应该保持 一致

大致思路:因为不能改变数组的长度,题目要求的是返回数组的新长度,那么就把符合要求的元素放在数组的前k位,最后返回数组的长度k,k后面的数组元素不需要去管(如果这个数组是无序的,这个方法就不可以了

题目:

输入:nums = [1,1,2] 输出:2, nums = [1,2,_] 解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

解答: 本题需要有两个指针,分别是i和j,i指向的是数组中的不重复项,j会遍历除了数组的第一个元素外的整个数组,如果i和j指向的不相等,如下图

image.png

    <script>
        let arr=[0,0,1,1,2,2,3,3,4,4,5,5];
        let i=0,j=1;
        while(j<arr.length){
            if(arr[i]===arr[j]){
                j++;
            }
            else{
                arr[i+1]=arr[j];
                i++;
                j++;
            }
        }
        console.log(i+1,"最新的长度是")
    </script>
移除元素

题目描述:

输入:nums = [0,1,2,2,3,0,4,2], val = 2 输出:5, nums = [0,1,4,0,3] 解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

思路: 也是使用双指针,分别是i和j,i记录出现val元素的地方,j整个数组进行遍历,当j遇到不等于val的值后,就会将值赋给i所在的地方,覆盖掉val值(特别注意,i和j一开始要指向同一个位置,因为第一个位置也有可能出现val

image.png

 function shanchu(arr,val){
            let i=0,j=0;
        while(j<arr.length){
            if(arr[j]!=val){
                arr[i]=arr[j];
               i++;
               j++;
            }
            else{
                j++;
            }
        }
        return i;
        }

参考:juejin.cn/post/709626…