一、题目
给你一个 非严格递增排列 的数组 nums
,请你原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums
中唯一元素的个数。
考虑 nums
的唯一元素的数量为 k
,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums
,使nums
的前k
个元素包含唯一元素,并按照它们最初在nums
中出现的顺序排列。nums
的其余元素与nums
的大小不重要。 - 返回
k
。
二、思路
一旦出现原地,基本都要用到双指针。
我们可以使用两个指针来解决这个问题:
- 快指针(fast):用于遍历整个数组,找到所有唯一的元素。
- 慢指针(slow):用于标记唯一元素的位置,并在原地修改数组。
三、步骤
- 初始化两个指针
slow
和fast
,都指向数组的第一个元素。 - 遍历数组,使用
fast
指针逐个检查每个元素。 - 如果
nums[fast]
不等于nums[slow]
,说明找到了一个新的唯一元素,将nums[slow]
更新为nums[fast]
,并将slow
指针向前移动一位。 - 继续移动
fast
指针,直到遍历完整个数组。 - 最终,
slow
指针的位置加一就是唯一元素的个数k
。
① JavaScript代码:
javascript
function deleteSame(nums){
if (nums.length === 0){
return 0;
}
let slow = 0;
for(let fast = 0; i<nums.length; i++){
if(nums[fast] !== nums[slow]){
slow ++;
nums[slow] = nums[fast];
}
}
return slow + 1;
}
② python代码:
python
def deleteSame(nums):
if not nums:
return 0
slow = 0
for fast in range(len(nums)):
if nums[fast] != nums[slow]:
slow += 1
nums[slow] = nums[fast]
return slow+1
四、实例
假设我们有一个数组 nums = [1, 1, 2, 3, 3, 4]
:
- 初始状态:
slow = 0
,fast = 1
。 nums[1] == nums[0]
,fast
移动到下一个位置。nums[2] != nums[0]
,slow
移动到下一个位置,nums[1] = nums[2]
,此时slow = 1
。nums[3] != nums[1]
,slow
移动到下一个位置,nums[2] = nums[3]
,此时slow = 2
。nums[4] == nums[2]
,fast
移动到下一个位置。nums[5] != nums[2]
,slow
移动到下一个位置,nums[3] = nums[5]
,此时slow = 3
。
最终,nums
变为 [1, 2, 3, 4, 3, 4]
,slow
的值是 3。
由于 slow
指针的值是唯一元素的个数减一,所以唯一元素的个数是 slow + 1 = 4
。
slow
指针的值是唯一元素的个数减一。- 为了得到唯一元素的个数,我们需要返回
slow + 1
。