首页 > 其他分享 >leetcode面试经典 150 题第三题(26. 删除有序数组中的重复项)#更适合新手学习

leetcode面试经典 150 题第三题(26. 删除有序数组中的重复项)#更适合新手学习

时间:2024-12-11 11:30:34浏览次数:4  
标签:150 26 set nums int 元素 重复 数组 leetcode

 题目:

26. 删除有序数组中的重复项 - 力扣(LeetCode)

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

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

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

判题标准:

系统会用下面的代码来测试你的题解:

int[] nums = [...]; // 输入数组
int[] expectedNums = [...]; // 长度正确的期望答案

int k = removeDuplicates(nums); // 调用

assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
    assert nums[i] == expectedNums[i];
}

如果所有断言都通过,那么您的题解将被 通过

示例 1:

输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 不需要考虑数组中超出新长度后面的元素。

示例 2:

输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

提示:

  • 1 <= nums.length <= 3 * 104
  • -104 <= nums[i] <= 104
  • nums 已按 非严格递增 排列

题目理解:

此题需要注意给的已知条件:
1、 原地 移除

2、使每个元素只出现一次,那就是只留下一个

3、非严格递增排列(放在最后)

疑问点:

1、新手同学最不能理解的就是“原地”这个词的意思了,其实就是这个元素删除,其余的往前排,和ArrayList的remove是一样的

2、非严格递增序列怎么用?

思路:

如果是新手同学建议先写27这道题(没做过的也建议先看这道题),更有助于理解,附链接:

leetcode面试经典 150 题第二题(27. 移除元素)#更适合新手学习-CSDN博客

先用最笨的思路,既然不让重复,那就把遍历过的元素进行储存下来,瞬间想到一个好用的数据结构:HashSet,这就好办了,如果set中有这个元素就跳过它,也就是删除它。如果没有这个元素,就把这个元素储存到set集合中,并正常遍历

这个时候大家发现,有一个条件没有用到,非严格递增序列,他要怎么用呢?既然是算法那就追求高性能,用上这个条件就比上面的程序更快的处理程序了

非严格递增就代表着相同的元素都在一起,就可以省下set集合的使用,怎么去写呢?

遍历这个数组,并记录现在不重复的这个元素目前的下标,一样则继续遍历不改变不重复元素目前的下标,不一样那就将不重复元素下标后面的那个值进行赋值,并将不重复的这个元素进行记录(文字描述可能不太清晰,代码可能解释的比我好,大家可以直接读代码)

代码:

简单思路代码:

class Solution {
    public int removeDuplicates(int[] nums) {
        int i = 0;
        Set<Integer> set = new HashSet<>();
        for(int j = 0; j < nums.length; j++){
            if(set.contains(nums[j])){
                continue;
            }
            nums[i ++] = nums[j];
            set.add(nums[j]);
        }
        return i;
    }
}

使用非严格递增序列代码,想提升的同学可以试着理解一下这个代码(这个代码也是双指针的一种应用场景):

 public int removeDuplicates(int[] nums) {
    if(nums == null || nums.length == 0) return 0;
    int p = 0;
    int q = 1;
    while(q < nums.length){
        //查看是否重复
        if(nums[p] != nums[q]){
            nums[p + 1] = nums[q];
            p++;
        }
        q++;
    }
    //返回长度,所以下标+1
    return p + 1;
}

欢迎大家指正交流
留个关注,点个赞再走呗~

标签:150,26,set,nums,int,元素,重复,数组,leetcode
From: https://blog.csdn.net/m0_59559099/article/details/144394790

相关文章

  • LeetCode:2717、半有序队列
    题目:给你一个下标从0开始、长度为n的整数排列nums。如果排列的第一个数字等于1且最后一个数字等于n,则称其为半有序排列。你可以执行多次下述操作,直到将nums变成一个半有序排列:选择nums中相邻的两个元素,然后交换它们。返回使nums变成半有序排列所需的最......
  • leetcode61:旋转链表
    原题地址:61.旋转链表-力扣(LeetCode)题目描述给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。示例1:输入:head=[1,2,3,4,5],k=2输出:[4,5,1,2,3]示例2:输入:head=[0,1,2],k=4输出:[2,0,1]解题思路明确旋转规则:每次旋转,将......
  • 代码随想录算法训练营第四十三天|LeetCode300.最长递增子序列、LeetCode674.最长连续
    前言打卡代码随想录算法训练营第49期第四十三天 (๑ˉ∀ˉ๑)首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的训练营大家庭一起进步。LeetCode300......
  • 11.26[java exp3][debug]
    :org.apache.spark.SparkClassNotFoundException:[DATA_SOURCE_NOT_FOUND]Failedtofindthedatasource:mongodb.Pleasefindpackagesat`https://spark.apache.org/third-party-projects.html`.由于spark 中缺少如下相关jar包:mongo-java-driver-3.10.2.jar ......
  • 代码随想录day14 | leetcode 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 1
    226.翻转二叉树前序和后序写法都可以我用的是前序错误写法classSolution{publicTreeNodeinvertTree(TreeNoderoot){if(root==null)returnnull;swap(root.left,root.right);invertTree(root.left);invertTree(root.r......
  • leetcode 2024. 考试的最大困扰度
    2024.考试的最大困扰度法一:两次滑动窗口classSolution{public:intmaxConsecutiveAnswers(stringanswerKey,intk){intsize=answerKey.size(),temp=k,res=0,left,right;for(left=0,right=0;right<size;++right){//F->T......
  • Leetcode_打家劫舍
    题目:你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ......
  • leetcode 2779. 数组的最大美丽值
    2779.数组的最大美丽值暴力超时解......
  • leetcode 2958. 最多 K 个重复元素的最长子数组
    2958.最多K个重复元素的最长子数组classSolution{public:intmaxSubarrayLength(vector<int>&nums,intk){intsize=nums.size(),resLenth=0;unordered_map<int,int>numAdded;for(intleft=0,right=0;right<siz......
  • H.265流媒体播放器EasyPlayer.js网页直播播放器,如何在vue3中播放H.265视频流?
    在Vue3中使用EasyPlayer播放H.265视频流,你需要先确保你已经安装了EasyPlayer播放器库,以及相关的依赖和支持的H.265编解码器。以下是一个基本的示例,说明如何在Vue3应用中集成EasyPlayer并播放H.265视频流。步骤1:安装依赖确保你的项目中已经安装了EasyPlayer,你可以通过npm或ya......