进阶
思路
最通用的思想就是指针
1.两个指针left right
2.left 用来定位位置,right用来遍历数组
- 涉及到循环条件: 数组的长度
- 涉及到if判断: 遇到相同元素的处理
以力扣平台题目为示例
基础
给你一个 非严格递增排列 的数组
nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回nums
中唯一元素的个数。考虑
nums
的唯一元素的数量为k
,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums
,使nums
的前k
个元素包含唯一元素,并按照它们最初在nums
中出现的顺序排列。nums
的其余元素与nums
的大小不重要。- 返回
k
。
# 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返#回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
if not nums:
return 0
# j = 0
# for i in range(1, len(nums)):
# if nums[i] != nums[j]:
# j += 1
# nums[j] = nums[i] # 保证删除重复的元素
# return j + 1
left = 0
for right in range(1,len(nums)):
# 如果相等, 说明right指向的元素是重复元素,不保留
if nums[right] == nums[left]:
continue
# 如果不相等, 说明right指向的元素不是重复元素,保留,然后右移left一个单位,再把right的值赋给left
left += 1
nums[left] = nums[right]
return left + 1
进阶
给你一个有序数组
nums
,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
if not nums:
return 0
left = 1
for right in range(2, len(nums)):
if nums[right]==nums[left] and nums[right] == nums[left-1] :
continue
left += 1
nums[left] = nums[right]
return left + 1
万能模版
# 修改k值即可
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
if not nums:
return 0
K = 2
left = K - 1
for right in range(K, len(nums)):
tag = True
for i in range(K):
tag *= nums[right] == nums[left - i]
if tag:
continue
left += 1
nums[left] = nums[right]
return left + 1
力扣大佬讲解链接:. - 力扣(LeetCode)