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

题目

题目

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

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

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

算法分析

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

  1. 刚开始的时候,指针i只想数组下标为1的位置,指针k指向数组下标为0的位置。所以numsk==nums0,numsi=nums1。
  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;
    }
};
相关推荐
启观川12 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法
码爸12 小时前
排序算法介绍
python·算法·排序算法
sm_9267870512 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
by2099912 小时前
C++ 多态:同一个基类接口,调用不同的函数
开发语言·c++·经验分享·多态
colinu12 小时前
C++ 异步任务与线程生命周期:`std::async`、`future`、`thread`、`jthread` 与协作式退出
java·jvm·c++
Interview Aid11213 小时前
SoFi 面试流程全解析:技术面试、OA 与备考指南
面试·职场和发展
动词ing13 小时前
【题目练习】算法 组合总和||
算法
wuminyu13 小时前
ForkJoinPool窃取线程在扫描其他WorkQueue时的随机采样算法与Phase线程挂起唤醒机制解析
java·linux·c语言·jvm·c++
longlongzihan13 小时前
链表找环:Floyd 判圈算法(LeetCode 141 & 142 )
c++·算法·leetcode·链表
专业程序开发源13 小时前
flask家电故障预测系统92491-计算机课程设计/毕业设计
vscode·python·sql·算法·flask·课程设计