本文目录
- 1 中文题目
- 2 求解方法:快慢双指针法
- 2.1 方法思路
- 2.2 Python代码
- 2.3 复杂度分析
- 3 题目总结
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]sf1. fast=1,nums[1]==nums[0]:
[1,1,2,2,3,4,4]s f2. fast=2,nums[2]!=nums[1]:
[1,2,2,2,3,4,4]s f3. fast=3,nums[3]==nums[2]:
[1,2,2,2,3,4,4]s f4. fast=4,nums[4]!=nums[3]:
[1,2,3,2,3,4,4]s f5. fast=5,nums[5]!=nums[4]:
[1,2,3,4,3,4,4]s f6. 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:# 如果数组为空,直接返回0if 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 题目总结
题目难度:简单
数据结构:数组
应用算法:双指针法