在我接触到这道题的时候想的就是一次遍历,设置两个变量记录当前遍历到的数字和对应原数组应该修改的index,在运行过程中,因为原数组已经是有序的了,只不过会存在重复的数字,但是这些重复的数字也是挨在一起的,所以我们默认nums的第一个元素不用做修改,currentNum就等于nums[0],index也直接从1开始,往后遍历,如果遇到数字和currentNum相等的,就是重复的数字,直接跳过即可,遇到不相等的就是我们要记录在nums中index所在位置的数字,直接令currentNum等于这个数字,修改对应nums相应位置的数字并往后进行,直到程序结束即可
class Solution(object):
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
i, index = 1, 1
currentNum = nums[0]
while i < len(nums):
while nums[i] != currentNum:
currentNum = nums[i]
nums[index] = currentNum
index += 1
i += 1
return index
看了题解,我的思想类似与题解中的快慢指针解法,首先注意数组是有序的,那么重复的元素一定会相邻。要求删除重复元素,实际上就是将不重复的元素移到数组的左侧。考虑用 2 个指针,一个在前记作 p,一个在后记作 q,算法流程如下:比较 p 和 q 位置的元素是否相等,如果相等,q 后移 1 位,如果不相等,将 q 位置的元素复制到 p+1 位置上,p 后移一位,q 后移 1 位。重复上述过程,直到 q 等于数组长度。
返回 p + 1,即为新数组长度。
题解:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/solutions/34033/shuang-zhi-zhen-shan-chu-zhong-fu-xiang-dai-you-hu/
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
if not nums:
return 0
n = len(nums)
fast = slow = 1
while fast < n:
if nums[fast] != nums[fast - 1]:
nums[slow] = nums[fast]
slow += 1
fast += 1
return slow