美文网首页
LeetCode 26. 删除排序数组中的重复项(简单题)

LeetCode 26. 删除排序数组中的重复项(简单题)

作者: 金锡圭璧 | 来源:发表于2019-11-29 00:17 被阅读0次

1.题目描述:

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array

2.题解思路:

注意到数组是有序的,所以重复的元素一定是相邻的。

题目要求在原地删除重复出现的元素,其实就是将后边不重复的元素移动到前边,替代那些重复的元素。

也就是说,遇到重复元素不做处理,遇到不重复元素才往前覆盖。

可以考虑使用双指针法(快慢指针)。快指针从第二个元素开始(下标1)遍历数组中所有的元素,慢指针指向最后一个不重复的元素(初始为下标0)。

当快指针j指向的值和慢指针i指向的值相等时,说明快指针指向的是重复元素,所以慢指针不动(因为下一个就是重复元素了,而慢指针指向的是不重复元素),快指针自增。

当快指针j指向的值和慢指针i指向的值不相等时,说明快指针指向的是不重复元素,需要将这个不重复元素覆盖到第一个重复元素的位置(也就是慢指针的下一个位置),再将快指针自增。

3.代码实现:

public int removeDuplicates(int[] nums) {
        if (nums.length == 0) {
            return 0;
        }
        int i = 0;
        for (int j = 1; j < nums.length; j++) {
            if (nums[i] != nums[j]) {
                nums[++i] = nums[j];
            }
        }
        return i + 1;
}
复杂度分析:
  • 时间复杂度:O(n),假设数组的长度是n,需要遍历n步。
  • 空间复杂度:O(1),不需要额外开辟新的空间。

相关文章

网友评论

      本文标题:LeetCode 26. 删除排序数组中的重复项(简单题)

      本文链接:https://www.haomeiwen.com/subject/onruwctx.html