首页 > 其他分享 >[leetcode刷题]面试经典150题之3删除有序数组中的重复项(简单)

[leetcode刷题]面试经典150题之3删除有序数组中的重复项(简单)

时间:2024-09-20 22:54:31浏览次数:13  
标签:返回 150 nums 元素 唯一 数组 指针 leetcode 刷题

题目 

删除有序数组中的重复项

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

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

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

解决思路:

我们可以通过双指针法来高效解决这个问题:

  • 使用两个指针 ij
  • i 是慢指针,指向最后一个处理好的唯一元素的位置。
  • j 是快指针,遍历整个数组,寻找与 nums[i] 不同的元素。
  • nums[j]nums[i] 不相同时,说明找到了新的唯一元素,将它放到 i+1 的位置,并移动 i

步骤:

  1. 初始化:将 i 初始化为 0,表示当前唯一元素的最后一个位置。j 从 1 开始,遍历整个数组。
  2. 比较元素:对于每个 j,如果 nums[j]nums[i] 不同,说明找到新的唯一元素,将其放到 nums[i+1],并移动 i
  3. 返回结果:最终 i+1 就是去重后数组的长度 k

代码

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        
        i = 0  # 慢指针,指向唯一元素的最后位置
        for j in range(1, len(nums)):  # 快指针,从第二个元素开始遍历
            if nums[j] != nums[i]:  # 如果找到不同的元素
                i += 1  # 移动慢指针
                nums[i] = nums[j]  # 更新唯一元素
        
        return i + 1  # 返回唯一元素的数量(数组长度)

标签:返回,150,nums,元素,唯一,数组,指针,leetcode,刷题
From: https://blog.csdn.net/m0_63680328/article/details/142406580

相关文章

  • LeetCode 876
    题目:LeetCode876解法一:快慢指针注意:while循环条件,以链表(1,2,3,4,null)为例:当条件为fast!=null&&fast.next!=null时,若链表元素为偶数个,则返回中间的后一个节点(3)当条件为fast.next!=null&&fast.next.next!=null时,若链表元素为偶数个,则返回中间的前一个节......
  • [leetcode刷题]面试经典150题之5多数元素元素(简单)【附Boyer-Moore 投票算法(摩尔投票法
    很有意思的一个题,想了半天没想出来,最后发现两行代码就做出来了。写完后学习到还可以用Boyer-Moore投票算法,能减小空间复杂度,我把它写在后面,可以进一步学习。题目  多数元素给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊......
  • 【LeetCode Hot 100】11. 盛最多水的容器
    题目描述首先记录一下题目的解法。使用双指针记录容器的边界,从边界最大的容器开始,i位于最左侧,j位于最右侧。每次向中间移动高度较小的那个指针,并使用一个变量res记录容器最大的容积(即最终的答案)。//C++classSolution{public:intmaxArea(vector<int>&height){......
  • leetcode关于a++>等运算符优先级知识点辨析
    我偶然发现巧用++a>i可以大大缩减版面,方便检查。但对于相关优先级的知识点,我却有点模糊,所以对这个知识点进行辨析。1++a>i;a先加1,再与i比较2a++>i;a先与i比较再加13i<a++;a先比较再加14i<++a;a先加1再比较5--a>ia先减1再比较6a-->ia先比较再减17i<a--先......
  • Leetcode:交替合并字符串
    问题陈述1768.交替合并字符串给定两个字符串,word1和word2,任务是通过交替字符来合并它们。该过程从word1开始,一直持续到一个字符串用完为止。较长字符串中的任何剩余字符都将附加到合并字符串的末尾。我的思考过程考虑到问题的简单性,我立即认识到两指针方法是最合适的......
  • Leetcode #允许一个函数调用
    给定一个函数fn,返回一个与原始函数相同的新函数,除了它确保fn最多被调用一次。第一次调用返回的函数时,它应该返回与fn相同的结果。随后每次调用它时,它都应该返回未定义。示例1:输入:fn=(a,b,c)=>(a+b+c),调用=[[1,2,3],[2,3,6]]输出:**explanation:**登录后复制const......
  • leetcode刷题day22|回溯算法Part01( 77. 组合 、216. 组合总和 III、17.电话号码的字母
    前言:回溯是递归的副产品,只要有递归就会有回溯,回溯函数也就是递归函数。回溯是暴力穷举解法,效率并不高。但一些问题只能使用回溯来解决。回溯法,一般可以解决如下几种问题:组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定规则有几种切割方式子集问题:一......
  • leetcode刷题day23|回溯算法Part02(39. 组合总和 、40.组合总和II、131.分割回文串)
    39.组合总和思路:这个题与77.组合的差异在于元素可以无限制重复被选取,那么只需要更改startIndex即可,每一层递归都可以从头选用元素。回溯三部曲与77.组合基本一致。代码如下:classSolution{List<List<Integer>>result=newArrayList<>();List<Integer>pa......
  • leetcode刷题day24|回溯算法Part03(93.复原IP地址、78.子集、90.子集II)
    93.复原IP地址思路:这个题和131.分割回文串一样都是对字符串进行分割,只不过这个子字符串判断时是看是不是0-225之间的数字。回溯三部曲:1、递归函数参数:全局变量:String数组result存放结果集。递归函数参数:原字符串;startIndex,因为切割过的地方不能重复切割,和组合问题是一样......
  • 【题库上新】信息技术处理员题库已上线!快来一起免费刷题!
    每年报名软考的考生中,有一大部分都是为了入户而考的,为此,51CTO软考题库上线了信息处理技术员题库,科目简单,通过率较高,入户方便快捷。信息技术处理员证书有什么作用?(1)积分入户深圳初级职称配合大专以上学历能多加10分,广州积分最高加50分(20分初级证,10分工作证明,20分属于紧缺),需要注意的是......