【leetcode刷题】 面试经典150题 26. 删除有序数组中的重复项

leetcode刷题
面试经典150
26. 删除有序数组中的重复项
难度:简单

一、题目内容

给你一个 非严格递增排列 的数组 n u m s nums nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k k k ,你需要做以下事情确保你的题解可以被通过:

  • 更改数组 n u m s nums nums ,使 n u m s nums nums 的前 k k k 个元素包含唯一元素,并按照它们最初在 n u m s nums nums 中出现的顺序排列
  • n u m s nums nums 的其余元素与 n u m s nums nums 的大小不重要
  • 返回 k 。

二、自己实现代码

2.1 两个指针

2.1.1 实现思路

  • 考虑指针a和指针b,指向的元素是否相等,依据是否相等做下一步判断

因为没有考虑到 a和a-1比较,所以思路很复杂繁琐,在这里就不写了,直接写,后面想到的第二个双指针方法

2.2 方法二:排序整体删除再补充

2.2.1 实现思路

  • 两个指针
  • i :用来遍历整个list的快指针
  • b 用来计算有多少个不同数目的指针
    如果两个元素不一样,那么当前b的位置的值等于i位置的值,并且b往后移动一位
    在这里插入图片描述

2.2.2 实现代码

class Solution(object):
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        b = 1
        for i in range(1, len(nums)):
            if nums[i] != nums[i-1]:
                nums[b] = nums[i] 
                b += 1
        return b

2.2.3 结果分析

在这里插入图片描述

三、 官方解法

用的是自己实现的法二
所以,证明写题还是有必要的
算法思维确实有在精简和提高了

四、一些注意的地方

  1. 多想一想双指针,用下来真的会方便好多
  2. 在比较的时候,可以考虑 nums[a]和nums[a-1]比较
    • 一开始的时候,设置a=1,
    • 这样不会超出限制又可以比较所有元素
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值