题目:
给你一个 非严格递增排列 的数组 nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums
中唯一元素的个数。
考虑 nums
的唯一元素的数量为 k
,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums
,使nums
的前k
个元素包含唯一元素,并按照它们最初在nums
中出现的顺序排列。nums
的其余元素与nums
的大小不重要。 - 返回
k
。
思路:
转自评论区。作者:Necho
考虑双指针法的快慢指针了,定义slow和fast作为指针,初始化时指针slow指向数组的起始位置(nums[0]),指针fast指向指针slow的后一个位置(nums[1])。随着指针fast不断向后移动,将指针fast指向的元素与指针slow指向的元素进行比较。
slow 指针从头开始在原有基础上更改元素,使得最后的slow指过的元素都是原指针里的无重复元素(并且形成了链表)
如果nums[fast] ≠ nums[slow],那么nums[slow + 1] = nums[fast];
如果nums[fast] = nums[slow],那么指针fast继续向后查找;
原思路:依次遍历。把第0个元素拿出来,遍历剩下的元素并删除。把第一个元素拿出来,遍历1之后的元素。
代码:
class Solution(object):
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
slow =0
fast=1
while fast <len(nums): #fast走到结尾就停止
if nums[slow]==nums[fast]:
fast=fast+1
elif nums[slow]!=nums[fast]:
slow=slow+1
nums[slow]=nums[fast]
fast=fast+1
return slow+1
不懂点:
还是链表。如何返回的更改后的数组呢。slow只是数字。是因为链表被改了吗