一.个人探索
二.网上优秀编程
三.程序扩展
题目描述:给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
题目解读:
1)给定的是一个排序数组,暗示相同的元素会紧挨在一起
2)不要用额外的数组空间,也就是只能对原数组进行修改
一.个人探索
1.del函数的应用
答题思路:为了防止出现数组元素超出范围的情况,我们采取倒序进行删除的方法
具体程序如下:
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
for i in range(len(nums)-1,0,-1):
if nums[i]==nums[i-1]:
del nums[i]
return len(nums)
这个程序的运行效果较优,运行速度较快
总体运行情况也很稳定
优点:简单易编写,运行速度和内存消耗效果都很好
2.while,for双循环法
产生这种思路的主要原因是没有考虑到所给数组是已经排好序列的了。
答题思路:利用while循环的条件可以动态变化的特点,内部嵌套上for循环进行正向逐一排查,并利用remove函数或者del函数进行移除
优点:能够排查彻底
缺点:耗费时间太多
具体程序如下:
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
i=0
k=0
while i<len(nums):
for j in range(i):
if nums[j]==nums[i]:
nums.remove(nums[i])#也可以改成del nums[i]
k=1
break
if k==1:
k=0
continue
i=i+1
return len(nums)
程序运行的时间也是很慢:
3.for,for双循环
这个方法跟第二种差不多
具体程序如下:
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
for i in range(len(nums)-1,-1,-1):
for j in range(i-1,-1,-1):
if nums[j]==nums[i]:
nums.remove(nums[i])
break
return len(nums)
二.网上优秀编程
双指针法
思路:由于必须要原地删除,就不考虑用其他数据结构储存。然后可以想到,用指针变量来辅助存储。
双指针思想:相当于从原地,得到了一个与原数据结构有关联新数据结构。
题目特征和需要注意的地方:
1.输入空列表
如果不加上前提条件,会出现空列表错误
2.给出的是有序列表(?)
无序列表无法用此种方法解题
具体程序如下:
class Solution:
def removeDuplicates(self, nums: List[int]) -> 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
作者:linksnow
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/solution/shen-ru-li-jie-shu-zu-zhong-shi-yong-shuang-zhi-zh/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
三.程序扩展
如果可以用外加数组来做并且考虑不是有序数组的话,可以采用下面的这种形式:
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
a=[]
for i in range(len(nums)-1,0,-1):
for j in range(i):
if nums[j]==nums[i]:
a.append(i)
break
for i in a:
nums.remove(nums[i])
return len(nums)