关键知识点:快慢指针
题解:
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
slow, fast = 0, 1
if len(nums) > 1:
while fast < len(nums):
if nums[fast] == nums[slow]:
fast += 1
elif nums[fast] != nums[slow]:
nums[slow+1] = nums[fast]
slow += 1
fast += 1
return slow+1
题目说明数组有序,那其实比较两个元素是否相邻即可。
如果直接对重复元素遍历进行list.pop()的操作,那循环的list下标会溢出,题目又要求要在原list中进行删除,所以也不能用一个新的列表进行结果的保存。
所以需要换个思路,即将不重复的元素移到左侧,那就是分为两种if判断情况:
1. 如果nums[slow] == nums[fast]:fast继续往后移动,直到找到不同的元素
2. 如果nums[slow] != nums[fast]:slow的下一个值设置为fast所指的不同的值,同时两个指针都往后移动一格。
另外,最开始我想了个比较笨的办法,把重复的下标存起来,遍历完了再一起删除,效率非常低:
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
if len(nums) > 1:
idx = []
for i in range(1, len(nums)):
if nums[i] == nums[i-1]:
idx.append(i)
count = 0
for i in idx:
nums.pop(i - count)
count += 1
print(nums)
return len(nums)
其实按照这个思路的话,可以倒序遍历整个list,然后原地pop,效率高了很多:
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
if len(nums) > 1:
for i in range(len(nums)-1, 0, -1):
print(i)
if nums[i] == nums[i-1]:
nums.pop(i)
return len(nums)