• LeetCode26.删除有序数组中的重复项(双指针法)


    LeetCode26.删除有序数组中的重复项

    1.问题描述

    给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
    考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

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

    示例 1:

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

    示例 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
    • 2
    • 3

    提示:

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

    2.解题思路

    1. 双指针法(快慢指针法):(和LeetCode27:移除元素方法相同
    • 快指针:进行数组遍历
    • 慢指针:即将被赋值的位置

    将目前位置与前一个位置上的数进行对比,如果一样,就移动指针去下一个位置访问下一个元素。如果不一样,赋值给慢指针。慢指针只要目前为止被填充了新值,就再向后移动一位。

    3.代码

    python:

    class Solution:
        def removeDuplicates(self, nums: List[int]) -> int:
            # 指针 i 进行数组遍历
            n = len(nums)
    
            # 指针 j 指向即将被赋值的位置
            j = 0  #慢指针
    
            # 开始对数组进行遍历
            for  i in range(n): 
    
                # 进行筛选
                if  i == 0 or  nums[i] != nums[i - 1] : 
                    # 赋值
                    nums[j] = nums[i]
                    # j 移动
                    j += 1
    
            # 获取结果
            return j 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    C++:

    class Solution {
    public:
        int removeDuplicates(vector<int>& nums) {
    
            // 指针 i 进行数组遍历
            int n = nums.size();
    
            // 指针 j 指向即将被赋值的位置
            int j = 0;
    
            // 开始对数组进行遍历
            for (int i = 0 ; i < n ; i++) {
    
                // 进行筛选
                if ( i == 0 ||  nums[i] != nums[i - 1]) {
                    // 赋值
                    nums[j] = nums[i];
    
                    // j 移动
                    j++;
                }
            }
    
            // 获取结果
            return j ;
    
        }
    };
    
    • 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
    • 26
    • 27
    • 28
  • 相关阅读:
    元宇宙怎么就这么火,市场喊起来的10万亿是吹嘘还是真相?
    跨域问题讨论
    Docker-Dockerfile
    LangChain: 类似 Flask/FastAPI 之于 Django,LangServe 就是「LangChain 自己的 FastAPI」
    C Primer Plus(第六版)16.18 编程练习 第5题
    海思高校合作——QA培训资料
    用于不同功率的模块式TEC半导体致冷器超高精度温度控制装置
    谈谈我的「数字文具盒」 - 生产力工具(上)
    springboot + solr
    Docker网络与资源管理
  • 原文地址:https://blog.csdn.net/liuxudanhahaha/article/details/134489198