LeetCode【0026】删除有序数组中的重复项
1 中文题目
给定一个 非严格递增排列
的数组 nums
,请 原地
删除重复出现的元素,使每个元素 只出现一次
,返回删除后数组的新长度。元素的 相对顺序
应该保持 一致
。然后返回 nums
中唯一元素的个数。
考虑 nums
的唯一元素的数量为 k
,需要做以下事情确保题解可以被通过:
- 更改数组
nums
,使nums
的前k
个元素包含唯一元素,并按照它们最初在nums
中出现的顺序排列。nums
的其余元素与nums
的大小不重要。 - 返回
k
判题标准:
系统会用下面的代码来测试代码:
int[] nums = [...]; // 输入数组
int[] expectedNums = [...]; // 长度正确的期望答案
int k = removeDuplicates(nums); // 调用
assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
assert nums[i] == expectedNums[i];
}
如果所有断言都通过,那么代码将被 通过。
示例:
输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。新长度后面的元素可以是任何值,也可以没有值。
输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
提示:
- 1 ≤ n u m s . l e n g t h ≤ 3 ∗ 1 0 4 1 \leq nums.length \leq 3 * 10^4 1≤nums.length≤3∗104
- − 1 0 4 ≤ n u m s [ i ] ≤ 1 0 4 -10^4 \leq nums[i] \leq 10^4 −104≤nums[i]≤104
-
n
u
m
s
nums
nums 已按
非严格递增
排列
2 求解方法:快慢双指针法
2.1 方法思路
方法核心
使用快慢双指针法,快指针遍历整个数组,慢指针指向当前需要被替换的位置。原地修改数组,不使用额外空间
实现步骤
(1)初始化:
- 处理空数组特殊情况
- 设置slow指针为1(因为第一个元素必然保留)
(2)遍历过程:
- 使用fast指针遍历数组
- 比较相邻元素是否相等
- 遇到不相等元素时,将其移动到slow位置
(3)完成条件:
- fast指针遍历完整个数组
- 返回slow指针的值(新数组的长度)
方法示例
输入:nums = [1,1,2,2,3,4,4]
过程演示:
初始状态:
[1,1,2,2,3,4,4]
s
f
1. fast=1,nums[1]==nums[0]:
[1,1,2,2,3,4,4]
s f
2. fast=2,nums[2]!=nums[1]:
[1,2,2,2,3,4,4]
s f
3. fast=3,nums[3]==nums[2]:
[1,2,2,2,3,4,4]
s f
4. fast=4,nums[4]!=nums[3]:
[1,2,3,2,3,4,4]
s f
5. fast=5,nums[5]!=nums[4]:
[1,2,3,4,3,4,4]
s f
6. fast=6,nums[6]==nums[5]:
[1,2,3,4,3,4,4]
s f
最终结果:
返回值:4
数组前4个元素:[1,2,3,4]
2.2 Python代码
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
# 如果数组为空,直接返回0
if not nums:
return 0
# slow指向当前需要被替换的位置
# fast指向当前遍历的位置
slow = 1
# 遍历数组,从第二个元素开始
for fast in range(1, len(nums)):
# 如果当前元素与前一个元素不相等
# 说明遇到了新的不重复的元素
if nums[fast] != nums[fast - 1]:
# 将新元素放到slow指向的位置
nums[slow] = nums[fast]
# slow向前移动一位
slow += 1
# 返回新数组的长度
return slow
2.3 复杂度分析
- 时间复杂度:O(n),n是数组长度
- 只需要遍历一次数组
- 每个元素最多被访问一次
- 空间复杂度:O(1)
- 只使用了两个指针变量
- 原地修改数组,不使用额外空间
3 题目总结
题目难度:简单
数据结构:数组
应用算法:双指针法
原文地址:https://blog.csdn.net/qq_32882309/article/details/143735280
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!