0
点赞
收藏
分享

微信扫一扫

LeetCode第26题,删除排序数组中的重复项

凉夜lrs 2022-04-30 阅读 84

LeetCode 高频题 数组篇

26.删除排序数组中的重复项

大家好,我是Panda

今天分享的是LeetCode第26题,删除排序数组中的重复项。

力扣题目链接:LeetCode.26

题目描述:

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

由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。

将最终结果插入 nums 的前 k 个位置后返回 k 。

不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

解法:双指针

首先注意数组是有序的,那么重复的元素一定会相邻。

题目中要求删除重复元素,实际上就是将不重复的元素移到数组的左侧。

可以利⽤快慢指针,p 指针从 0 开始,q 指针从 1 开始,如果 p 和 q 所指数字相等,就⼀直后移 q 。如果不相等,p

指针后移⼀位⽤来保存当前 q 所指的值,然后继续回到 q 的后移中去。

class Solution {
    public int removeDuplicates(int[] nums) {
        if (nums == null || nums.length == 0) return 0;
        int p = 0, q = 1;
        while (q < nums.length) {
            if (nums[p] != nums[q]) {
                nums[p + 1] = nums[q];
                p++;
            }
            q++;
        } 
        return p + 1;
    }
}

复杂度分析:

时间复杂度:O(n),其中 n 是数组的长度。快指针和慢指针最多各移动 n 次。
空间复杂度:O(1)。只需要使用常数的额外空间。

举报

相关推荐

0 条评论