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

题目

题目

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

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

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

算法分析

才用"双指针"的方法解决这个题,具体过程如下:

  1. 刚开始的时候,指针i只想数组下标为1的位置,指针k指向数组下标为0的位置。所以nums[k]==nums[0],nums[i]=nums[1]。
  1. 判断i指向的值与k指向的值是否一样,如果一样,说明二者重复,不作处理。i继续移动到下一个位置与k指向的位置的值进行判断。

3. 经过判断,i指向的值与k指向的值不一样,则k++,将k移动到下一个位置,然后将此时i指向的值赋值给k指向的位置。

  1. 继续判断i指向的值与k指向的值,经过三次比较后,i指向的值都与k指向的值一样,不作处理。等i第一次指向的值为2的时候,i指向的值与k指向的值不一样,那么,k++,将k移动到下一个位置,然后将此时i指向的值赋值给k指向的位置。
  1. 等i第二次指向的值为2的时候,与k指向的位置的值一样,不作处理,i继续向下移动一位。此时,i指向3,k指向2。二者的值不一样,那么,k++,将k移动到下一个位置,然后将此时i指向的值赋值给k指向的位置。

  2. 以此类推。最后,k的值为4(是变量k本身的值,不是k指向的数组的位置的值,这里正好k指向的数组的那个位置是4,只是巧了)。从数组的第一个节点到k指向的节点就是最终的想要的那个结果

7. 返回数组中不同的值的个数,返回从数组的第一个节点到k指向的节点的个数即可,因为k是从0开始的,所以返回k+1就是正确的结果

代码

cpp 复制代码
class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int len=nums.size();//求数组长度
        int k=0;
        for(int i=1;i<len;i++){
            if(nums[k]!=nums[i]){
                k++;
                nums[k]=nums[i];
            }
        }
        return k+1;
    }
};
相关推荐
Q***l68731 分钟前
C++在计算机图形学中的渲染
开发语言·c++
稚辉君.MCA_P8_Java37 分钟前
Gemini永久会员 Java动态规划
java·数据结构·leetcode·排序算法·动态规划
oioihoii1 小时前
C++语言演进之路:从“C with Classes”到现代编程基石
java·c语言·c++
小白程序员成长日记1 小时前
2025.11.23 力扣每日一题
算法·leetcode·职场和发展
咔咔咔的1 小时前
3190. 使所有元素都可以被 3 整除的最少操作数
c++
cookqq1 小时前
mongodb根据索引IXSCAN 查询记录流程
数据结构·数据库·sql·mongodb·nosql
T***16072 小时前
C++在游戏开发中的AI行为树
开发语言·c++
16_one2 小时前
autoDL安装Open-WebUi+Rag本地知识库问答+Function Calling
人工智能·后端·算法
ohyeah2 小时前
栈:那个“先进后出”的小可爱,其实超好用!
前端·数据结构
自由生长20243 小时前
为什么C++项目偏爱.cxx扩展名:从MongoDB驱动说起
c++