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;
    }
};
相关推荐
2301_7756023823 分钟前
C++11 多线程编程-小白零基础到手撕线程池
开发语言·c++
莫叫石榴姐24 分钟前
趣味SQL | 从围棋收官到秦楚大战的数据库SQL实现(下)
大数据·数据库·人工智能·sql·算法
fcblow27 分钟前
求10 个整数中最大值
c语言·算法·排序算法
码农豆豆39 分钟前
11.C++程序中的常用函数
开发语言·c++·算法
jcfszxc1 小时前
【Rockchip系列】RGA imcopy 性能分析:不同缓冲区拷贝的对比(含实验代码)
开发语言·c++·rknn·rockchip·rknn-toolkit2
GSCSDNeo1 小时前
9.23 My_string.cpp
开发语言·c++
LunarWave1 小时前
02-指针代码示例
c++
曳渔1 小时前
Java-数据结构-Map和Set-(二)-哈希表 |ू・ω・` )
java·开发语言·数据结构·算法·哈希算法·散列表
测试19981 小时前
基于Selenium+Python的web自动化测试框架
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
March€1 小时前
常见算法复习
java·算法·排序算法