2 删除有序数组中的重复项
给出数组并去重,每种数保留一个。
初期思路:双层for循环,遍历出每组数,将值相同索引不同的删去,使用remove()。
问题:每次remove都会改变数组,导致索引不好确定。
转换思路:不进行删除操作,妹妹身材一样的跳过,不一样的保留,重点在不同。
代码:
class Solution(object):
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
t = 0 #t作为遍历整个数组的指针
for i in nums:
if t < 1 or nums[t-1] != i:
nums[t] = i
t = t + 1
return t
分析:首先 t<1必定需要保留,将第一个值放在第一个位置,t++;之后就会遇到不同的妹妹,我们的指针妹妹为t,所以要分析第t-1个妹妹与第t个妹妹是不是一种妹妹,不同的话,保留指针t的妹妹的值,t再加加;返回的t值即为妹妹的种类值。
双指针思路:指针i遍历全程,指针j指向有效数组的最后一个位置,只有当i指向的值和j指向的值不一致时,将i的值添加到j的下一个位置(实际上还是不同的问题,利用了两个不同速度指针对数组进行修改)
class Solution(object):
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
n = len(nums)
j = 0
for i in range(n):
if nums[i] != nums[j]:
j = j + 1
nums[j] = nums[i]
return j+1
3 移除元素
给出数组和一个int数,删除数组中所有和给出数相同值的数组项,并返回修改后数组的长度
思路:很简单啦,一个for循环便利整个数组中的妹妹,与目标妹妹做个比较就行了,这里用remove()函数在每轮循环时会自动改变数组,加入数组中存在两个以上和目标妹妹长得一样的妹妹,会漏妹妹哦,注意从后往前遍历妹妹数组进入循环,好看的妹妹从后面不会漏还轻松。嘿嘿。
代码:
class Solution(object):
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
for i in range(len(nums)-1, -1 ,-1):
if nums[i] == val:
nums.remove(nums[i])
return len(nums)
这里可不可以试着用双指针来找妹妹呢?来个正面的?
因为不同就是使用双指针的关键,我们用双指针来把数组分为两个部分:不是要找的妹妹组和要找的妹妹组。
代码:
class Solution(object):
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
n = len(nums)
j = 0 # i负责遍历 j负责区分
for i in range(n):
if nums[i] != val:
nums[j] = nums[i] # 不相等则保留
j = j + 1
#如果遇到相等的 j就在上一轮的位置不动了,保留下一个不相等的num[i]
return j
心得:对于第一种方法要懂得后入,对于第二种方法要懂得:
这个妹妹走了,不要担心这个妹妹占过的位置空了怎么办,下个妹妹会很干脆的补上,用新妹妹覆盖旧妹妹,走了就是不值得,真的爱你的妹妹还在后面等你,不信?我删除2,print一下nums,看stdout!
![](https://img-blog.csdnimg.cn/img_convert/480adbb0d1da5f4cf803e16252871167.png)
是不是2妹妹在后面等你不离不弃?对吧 算法都这样,嘿嘿,想复杂了题就解不了。