题目:
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
在排序好的数组中删除重复项,这里我写两个方法,一个是自己的暴力破解,一个是官方解。两个算法时间复杂度都为O(n),但是官方解的效率要比我自己的高很多
- 暴力解
class Solution:
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
l = len(nums)
if l == 0:
return l
t = 0
for i in range(0,(l - 1)):
if t >= (l - 1):
break
if nums[t] == nums[t + 1]:
del nums[t]
l -= 1
t -= 1
t += 1
return len(nums)
这里我是对数组进行遍历,相同元素从数组删除,由于判断太多可能对时间影响较大,所以时间较长
- 官方解
class Solution:
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if len(nums) == 0:
return 0
i = 0
for j in range(1,len(nums)):
if nums[i] != nums[j]:
i += 1
nums[i] = nums[j]
return i + 1
官方解用了两个指针,j指针对数组进行遍历,如果不相同则插入到i的下一个位置,这样前i个位置就为数组中消除重复项的值了