从零开始,如何优雅地解决“删除排序数组中的重复项”问题

在简书平台上,有一个热门话题吸引了我的注意——“26. 删除排序数组中的重复项”。作为一名热爱编程的开发者,我决定深入研究这个问题,并分享我的思考和解决方案。


首先,我们需要明确题目要求:给定一个已经排序的整数数组,要求原地修改数组,移除所有重复的元素,使得每个元素只出现一次,并返回新数组的长度。同时,必须保证不能使用额外的数组空间,只能在原数组上操作。


### 1. 初探思路


当我第一次看到这个题目时,直觉告诉我可以利用双指针法来解决问题。于是,我尝试用最简单的例子验证这一想法:


例如,对于数组 [1, 1, 2],我们可以定义两个指针 i 和 j。其中,i 指向当前有效数组的末尾位置,而 j 用于遍历整个数组。当发现 nums[j] 与 nums[i] 不相等时,将 nums[j] 的值赋给 nums[i+1],并递增 i。


这种方法的优点在于无需额外空间,时间复杂度为 O(n),非常适合处理大规模数据。


### 2. 实现代码


接下来,我将上述思路转化为实际代码。以下是我的 Python 实现:


def removeDuplicates(nums):
if not nums:
return 0
i = 0
for j in range(1, len(nums)):
if nums[j] != nums[i]:
i += 1
nums[i] = nums[j]
return i + 1

通过这段代码,我们成功实现了对数组的去重操作。为了验证其正确性,我设计了几个测试用例:


- 输入:[1, 1, 2],输出:2,数组变为 [1, 2]


- 输入:[0, 0, 1, 1, 1, 2, 2, 3, 3, 4],输出:5,数组变为 [0, 1, 2, 3, 4]


### 3. 进阶挑战


在完成基础版本后,我开始思考更复杂的场景。比如,如果题目要求保留每个元素最多两次重复怎么办?经过一番思索,我发现可以通过引入计数器来解决:


def removeDuplicatesWithLimit(nums):
if not nums:
return 0
i = 1
count = 1
for j in range(1, len(nums)):
if nums[j] == nums[j-1]:
count += 1
else:
count = 1
if count <= 2:
nums[i] = nums[j]
i += 1
return i

这段代码允许每个元素最多出现两次,完美满足了进阶需求。


### 4. 总结与感悟


通过这次解题过程,我深刻体会到算法学习的乐趣所在。看似简单的问题背后,往往隐藏着丰富的优化空间。而双指针法作为一种高效且易于理解的技巧,值得我们在更多场景中加以应用。


如果你也对这道题感兴趣,不妨亲自动手实践一下吧!相信你会从中获得不少启发。

点赞(0)

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部