题目描述:
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
示例 1:
给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
不需要考虑数组中超出新长度后面的元素。
示例 2:
给定 nums = [0,0,1,1,1,2,2,3,3,4], 函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
你不需要考虑数组中超出新长度后面的元素。
解题思路1:
利用集合去重,然后逐一将去重后的值写入原有的数组中进行覆盖即可
代码1:
class Solution(object):
def removeDuplicates(self, nums):
for i in range(len(set(nums))):
nums[i] = sorted(list(set(nums)))[i]
return len(set(nums))
利用字典去重:
class Solution:
def removeDuplicates(self, nums):
dt = {}
index = 0
for num in nums:
if num not in dt.values():
dt[index] = num
index += 1
del nums[:]
for i in range(len(dt)):
nums.append(dt[i])
return index
s = Solution()
nums = [1,1,2]
print(s.removeDuplicates(nums))
解题思路2: 双指针法
快慢指针,如果不相等,慢指针向后移位。
注意: 这里的数组已经进行了排序。否则,需要先sorted()
才可以。
代码2:
写法1:
class Solution(object):
def removeDuplicates(self, nums):
if not nums: 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
写法2:
class Solution:
def removeDuplicates(self, nums):
nums.sort()
i, j = 0, 1
while j < len(nums):
if nums[i] == nums[j]:
j +=1
else:
nums[i+1] = nums[j]
i += 1
j += 1
return i+1
解题思路3:
将重复项 del
删除
代码3:
class Solution:
def removeDuplicates(self, nums):
i = 0
while(i != len(nums)):
if nums[i] in nums[i+1:]:
del nums[i]
else:
i += 1
return len(nums)
参考链接:
题目来源:
https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array