• LeetCode 26. 删除有序数组中的重复项 简单


    1. 26. 删除有序数组中的重复项 简单

    1. 题目详情

    给你一个 非严格递增排列 的数组 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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

    1. 原题链接

    LeetCode 26. 删除有序数组中的重复项 简单

    2. 题目要求

    示例 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 < = n u m s . l e n g t h < = 3 ∗ 104 1 <= nums.length <= 3 * 104 1<=nums.length<=3104
    − 104 < = n u m s [ i ] < = 104 -104 <= nums[i] <= 104 104<=nums[i]<=104
    n u m s nums nums 已按非严格递增排列

    3. 基础框架

    ● Cpp代码框架

    class Solution {
    public:
        int removeDuplicates(vector<int>& nums) {
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2. 解题思路

    1. 思路分析

    在这里插入图片描述

    ( 1 ) (1) (1) 数组 n u m s nums nums是非严格递增的,即非降序的。对数组 n u m s nums nums进行去重处理。
    ( 2 ) (2) (2) 一个变量 n e w P o s newPos newPos记录新数组位置的下标;一个变量 o l d P o s oldPos oldPos记录旧数组位置的下标;
    新数组默认没有任何元素,故 n e w P o s newPos newPos初始值设置为-1,是无效下标;
    旧数组就是原数组,默认从0下标开始,故 o l d P o s oldPos oldPos初始值为0;
    ( 3 ) (3) (3) 对于 n e w P o s newPos newPos为初始值-1的情况进行特殊处理,直接把 o l d P o s oldPos oldPos位置元素赋值给 n e w P o s newPos newPos的下一个位置即0下标位置;
    ( 4 ) (4) (4) 对于一般情况:
    首先可知 n e w P o s newPos newPos之前的元素(不包含newPos)都是有序且相对位置不变的去重后的唯一元素。
    n e w P o s newPos newPos当前位置的元素还未完全去重,通过比较 n e w P o s newPos newPos位置上的元素和 o l d P o s oldPos oldPos位置上的元素对该元素进行去重:
    如果 n u m s [ n e w P o s ] = = n u m s [ o l d P o s ] nums[newPos]==nums[oldPos] nums[newPos]==nums[oldPos]则说明 o l d P o s oldPos oldPos位置上的元素在新数组中已经存在,不再考虑;反之则把 o l d P o s oldPos oldPos位置上的元素赋值给 n e w P o s newPos newPos的下一个位置上。
    ( 5 ) (5) (5) 直到 o l d P o s oldPos oldPos遍历完旧数组原数组为止。
    在这里插入图片描述

    2. 时间复杂度

    O ( N ) O(N) O(N)

    o l d P o s oldPos oldPos遍历了一遍数组 n u m s nums nums

    3. 代码实现

    class Solution {
    public:
        int removeDuplicates(vector<int>& nums) {
            int newPos = -1;
            int oldPos = 0;
            while(oldPos < nums.size()){
                // 如果newPos是-1时特殊判断一下
               if(newPos == -1){
                   newPos++;
                   nums[newPos] = nums[oldPos];
               }
               // newPos位置表示当前已经存在的元素
               // oldPos位置表示将要放入的元素
               // 二者相等时则说明将要放入的元素在新数组中已经存在,;
               // 反之则说明将要放入的元素在新数组中还不存在,需要放入newPos的下一个位置;
               // 更新oldPos使其表示下一个位置的元素
               else if(nums[oldPos] != nums[newPos]){
                    newPos++;
                    nums[newPos] = nums[oldPos];
               }
               oldPos++;
            }
            return newPos + 1;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    class Solution {
    public:
        int removeDuplicates(vector<int>& nums) {
        	// 借助额外空间,且是唯一有序的set
            set<int> s;
            for(auto& e : nums){
                s.insert(e);
            }
            nums.clear();
            for(auto& e : s){
                nums.push_back(e);
            }
            return nums.size();
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    T h e The The E n d End End

  • 相关阅读:
    黑客专业术语认知
    javascript复习之旅 13.1 模块化(上)
    机器学习笔记-02
    java和C#md5算法互通
    【无标题】
    ffmpeg 像素格式基础知识
    【java毕业设计源码】基于SSM的疫情社区物资配送系统
    什么是箭头函数
    论文解读:PF磷酸:基于机器学习的磷酸化位点预测疟原虫蛋白的工具
    华为机试真题 Java 实现【运维日志排序】
  • 原文地址:https://blog.csdn.net/weixin_64904163/article/details/134334717