世界已冷酷至极, 让我们携手前行。
自助收录

使用双指针算法删除排序数组中的重复项

算法刷题2年前 (2023)更新 江南白衣
433 0 0
使用双指针算法删除排序数组中的重复项

题目:删除排序数组中的重复项
描述:一个有序数组nums,原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。
要求:不能使用额外的数组空间,必须在原地修改输入数组并在使用O(1) 额外空间的条件下完成。
例如:输入:[0,1,2,2,3,3,4],输出:5
双指针算法:
数组完成排序后,我们可以放置两个指针 i 和 j,其中 i 是慢指针,而 j 是快指针。只要nums[i]=nums[j],我们就增加 j 以跳过重复项。当遇到 nums[j] != nums[i]时,跳过重复项的运行已经结束,必须把nums[j])的值复制到 nums[i +1]。然后递增 i,接着将再次重复相同的过程,直到 j 到达数组的末尾为止。

package od;

/**
 * 删除排序数组中的重复项
 * 描述:一个有序数组nums,原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。
 * 重点考察:双指针算法
 * 原文地址:https://www.codernav.com/2788.html
 */
public class Odtest08 {
    public static void main(String[] args) {
        int[] arr = {0, 1, 2, 2, 3, 3, 4};
        System.out.println(f(arr));
    }

    private static int f(int[] arr) {
        if (arr.length < 1) {
            return 0;
        }
        // i慢指针,j快指针
        int i = 0;
        // 第一次遍历:i=0,j=1 -> 0,1,2,2,3,3,4 i=1
        // 第二次遍历:i=1,j=2 -> 0,1,2,2,3,3,4 i=2
        // 第三次遍历:i=2,j=3 -> 0,1,2,2,3,3,4 i=2
        // 第四次遍历:i=2,j=4 -> 0,1,2,3,3,3,4 i=3
        // 第五次遍历:i=3,j=5 -> 0,1,2,3,3,3,4 i=3
        // 第六次遍历:i=3,j=6 -> 0,1,2,3,4,3,4 i=4
        for (int j = 1; j < arr.length; j++) {
            if (arr[i] != arr[j]) {
                i++;
                arr[i] = arr[j];
            }
        }
        return i + 1;
    }
}

 

© 版权声明

相关文章

开发者导航新手教程

暂无评论

暂无评论...