删除有序数组中的重复项

问题描述

懒得写

思路

nums是给定数组,我计划建立一个temp数组,存储nums中不重复的值。
然后反过来遍历nums,将nums的前len[temp]个值改为对应的temp值。

class Solution: 
	def removeDuplicates(self, nums: List[int]) -> int: 
		temp = [] 
		for val in nums: 
			if val not in temp: 
				temp.append(val) 
		for i in range(len(temp)): 
			nums[i] = temp[i] 
		return len(temp)

但是成绩太拉了,真是八嘎。
为啥呢?
其实多考虑了,题目是有序数组,可以借助大小关系删除重复项来着。

class Solution:
	def removeDuplicates(self, nums: List[int]) -> int:
		del_list = []
		for i in range(len(nums) - 1):
			if nums[i] == nums[i+1]:
			del_list.append(i)
        # nums = [nums[j] for j in range(len(nums)) if j not in del_list]
			 del_list.sort(reverse = True)
			 for i in del_list:
				 nums.pop(i)
        return len(nums)

霍,好多了,我心甚慰,从击败14%到40%了。

这样做的思路是:

  1. 先创建一个del_list,用来存储需要删除的重复值的索引。
  2. 遍历nums,如果前数=后数,则代表这俩值重复了,把前数的索引用append方法添加到del_list中。
  3. 现在就想怎么删除了。用del方法?不行,del完,nums的长度会发生变化,到最后会发生索引超出nums的错误。
  4. 这里用了栈的pop()方法。假如del_list = [1, 3, 5],假如依次pop,到最后必定还会超出索引。所以先将del_list按照倒序排序一下,再倒过来pop

but,我现在一想,我都把del_list倒过来了,干嘛还要pop?我这时候直接del不行吗?我傻了,好像行啊。好吧,把nums.pop[i]换成del(nums[i]),好了,这下击败60%了。

为什么不问问chatgpt呢?

可以使用双指针法来实现删除有序数组中的重复项。

具体操作如下:

  1. 定义两个指针:slowfast,初始值均为 0
  2. 遍历数组,当 fast 指向的元素与 slow 指向的元素相同,则 fast 向后移动一位; 当 fast 指向的元素与 slow 指向的元素不同,则将 fast 指向的元素赋值给 slow + 1 的位置, 并同时将 slowfast 都向后移动一位。
  3. 遍历结束后,slow 的位置即为新数组的长度。

下面是代码实现:

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        n = len(nums)
        if n == 0:
            return 0

        slow = 0
        for fast in range(1, n):
            if nums[fast] != nums[slow]:
                slow += 1
                nums[slow] = nums[fast]

        return slow + 1

emmm,让我康康啊,这里首先判断了nums是不是空列表,如果是,就返回0
接下来,定义slow0,其实就是指向nums中第一个数,然后fast从第二个数开始遍历,如果fast指向的数不等于slow指向的数,代表这俩数不是重复项,把slow往后移一位,让背后将fast指向的数赋值给slow指向的数。

想象一下,假如nums = [1, 2, 2, 4, 4, 5]。

  1. 一次循环,比较第一个和第二个数,不是重复项的话就当无事发生,因为原地赋值了,啥也不是。
  2. 两个指针都向后移动一位,也就是比较第二三个数,如果这两个数重复,就比较二四数。
  3. 如果二四数不重复,slow指针向后移一位,第四项赋值给第三项,此时是[1, 2, 4, 4, 4, 5]
  4. 比较三五项,同样重复,单fast后移一位。
  5. 比较三六项,不重复,六项赋值四项。[1, 2, 4, 5, 4, 5]
  6. 最后slow指向第四项,也就是index=3,返回slow + 1

额,提交了一下,击败18.6%,还不如我自己写的那个呢。。。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值