leetcode-26:删除排序数组中的重复项

简介: leetcode-26:删除排序数组中的重复项

题目:

题目链接

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

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 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]);
}
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2gy9m/

解题:

方法一:

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        pre,cur=0,1
        while cur<len(nums):
            if nums[pre]==nums[cur]:
                nums.pop(cur)
            else:
                pre,cur=pre+1,cur+1
        return len(nums)

从前两个数开始,相邻的两个对比,重复就删除后面一个数

上述这种方法的缺点是,要是输入nums = [4,0,1,1,1,2,2,3,3,4]这样的列表,就不能正确的输出结果,该算法要求列表中的数把重复的放在一起。当然题目已经排序好了。

方法二:

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        nums[:] = list(sorted(set(nums)))
        return len(nums)

利用集合set的性质,相同元素只能存在一个。再转化为list,中途还排序了。nums[:]是对列表nums的内容进行修改。list(sorted(set(nums)))是新开辟内存空间,然后赋值给nums,必须用nums[:]修改。nums= list(sorted(set(nums))),如果是只写nums,也就是nums给的新的内存空间,就不能对原列表修改了。

方法三(lc官方解法):

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        if len(nums) == 0:
            return 0
        i = 0
        for j in range(1,len(nums)):#从0和1开始都行,因为第0个肯定是不同的一般就写从1开始了。
            if nums[j] != nums[i]:
                i+=1
                nums[i] = nums[j]
        # nums[:] = nums[:i+1]  题目中说了  你不需要考虑数组中超出新长度后面的元素。因此可以不加这句话
        return i + 1

双指针法,i是慢指针,j是快指针。只要两指针指向的内容不同,就给i指向的内容。那么前i+1个数就是不重复的。

或者换种写法的风格:

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        slow=0
        fast=0
        while fast<len(nums):
            if nums[fast]!=nums[slow]:
                slow+=1
                nums[slow]=nums[fast]
            fast+=1
        return slow+1

但是注意,这种情况就不行了。 slow+1放后面挪动一下,就不行了。

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        slow = 0
        fast = 1
        while fast<len(nums):
            if nums[slow]!=nums[fast]:
                slow+=1
                nums[slow]=nums[fast]
            # print(slow,fast,nums)
            fast+=1
        return slow+1

比如输入的是[0,0,1,1,1,2,2,3,3,4],打印一下可以发现

1 1 [0, 0, 1, 1, 1, 2, 2, 3, 3, 4]
2 2 [0, 1, 1, 1, 1, 2, 2, 3, 3, 4]
2 3 [0, 1, 1, 1, 1, 2, 2, 3, 3, 4]
2 4 [0, 1, 1, 1, 1, 2, 2, 3, 3, 4]
3 5 [0, 1, 2, 1, 1, 2, 2, 3, 3, 4]
4 6 [0, 1, 2, 2, 1, 2, 2, 3, 3, 4]
5 7 [0, 1, 2, 2, 3, 2, 2, 3, 3, 4]
6 8 [0, 1, 2, 2, 3, 3, 2, 3, 3, 4]
7 9 [0, 1, 2, 2, 3, 3, 4, 3, 3, 4]
3 5 [0, 1, 2, *1*, 1, *2*, 2, 3, 3, 4]  

加星的这两个在比较,于是出现了问题,我们要*1*前面的2和后面的做比较。而不是把要置换的东西和后面做比较。

因此要先比较完,然后slow+=1,把后面的一个给置换掉。

相关文章
|
1月前
leetCode(删除有序数组中的重复项)
如何在不使用额外空间的情况下,通过双指针法原地删除有序数组中的重复项。
33 2
|
1月前
【LeetCode-每日一题】 删除排序数组中的重复项
【LeetCode-每日一题】 删除排序数组中的重复项
19 4
|
1月前
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
18 0
Leetcode第三十三题(搜索旋转排序数组)
|
1月前
|
算法 C++
Leetcode第53题(最大子数组和)
这篇文章介绍了LeetCode第53题“最大子数组和”的动态规划解法,提供了详细的状态转移方程和C++代码实现,并讨论了其他算法如贪心、分治、改进动态规划和分块累计法。
57 0
|
1月前
|
C++
【LeetCode 12】349.两个数组的交集
【LeetCode 12】349.两个数组的交集
16 0
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
57 6
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
114 2
|
21天前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
16 1
|
2月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口