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;
    }
};
相关推荐
C++ 老炮儿的技术栈3 分钟前
VS2015 + Qt 实现图形化Hello World(详细步骤)
c语言·开发语言·c++·windows·qt
YuTaoShao4 分钟前
【LeetCode 每日一题】3634. 使数组平衡的最少移除数目——(解法一)排序+滑动窗口
算法·leetcode·排序算法
Once_day11 分钟前
C++之《Effective C++》读书总结(4)
c语言·c++·effective c++
波波00711 分钟前
每日一题:.NET 的 GC是如何分代工作的?
算法·.net·gc
柯一梦14 分钟前
STL2---深入探索vector的实现
c++
HY小宝F16 分钟前
职场沟通的深层智慧:从对抗到协作的自我修炼
职场和发展
风暴之零21 分钟前
变点检测算法PELT
算法
深鱼~21 分钟前
视觉算法性能翻倍:ops-cv经典算子的昇腾适配指南
算法·cann
李斯啦果22 分钟前
【PTA】L1-019 谁先倒
数据结构·算法
MSTcheng.22 分钟前
【C++】C++11新特性(二)
java·开发语言·c++·c++11