删除排序数组中的重复项

举报
黄大猩 发表于 2020/11/10 20:09:34 2020/11/10
【摘要】 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 示例 1:给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素。示例 2:给定 n...

给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。


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


 


示例 1:


给定数组 nums = [1,1,2], 


函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 


你不需要考虑数组中超出新长度后面的元素。

示例 2:


给定 nums = [0,0,1,1,1,2,2,3,3,4],


函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。


你不需要考虑数组中超出新长度后面的元素。

 


说明:


为什么返回数值是整数,但输出的答案是数组呢?


请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。


你可以想象内部操作如下:


// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝

int len = removeDuplicates(nums);


// 在函数里修改输入数组对于调用者是可见的。

// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。

for (int i = 0; i < len; i++) {

    print(nums[i]);

}



来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array


思路:

  1. 有序数组 

  2. O(1)额外空间,就不能用set()或者额外的list,判定规则也是去检查原有指针对应的值

首先有暴力解法,但是超过了复杂度,没过,这里需要使用双指针

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        p = 0
        q = 1
        
        while q + 1 <= len(nums):
            if nums[p] == nums[q]:
                q += 1
            else:
                p +=1
                nums[p] = nums[q]
            # print(p,q,nums)

        return p+1
  1. p为数组靠左的指针,即小指针

  2. q为数组靠右的指针,即大指针

  3. 初始状态p=0,q=1

  4. 进入while判断,如果数组为空或单个数,不进入while循环,返回p+1即1,答案会按nums[0:1]进行判定不会报错,

  5. 当小指针对应的数字与大指针相同,大指针右移

  6. 当小指针的值不等于大指针的值,小指针右移,并将对应的值改为大指针当前的值

  7. 当大指针与数组长度相同,跳出循环,返回此时小指针所在位置并加1(python取值原则[a,b))







【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。