精妙绝伦的算法之舞:解密力扣“删除有序数组中的重复项”

news/2024/7/5 1:50:48

在这里插入图片描述

本篇博客会讲解力扣“26. 删除有序数组中的重复项”这道题,这是题目链接。

老规矩,先来审题:
在这里插入图片描述
题目有对判题标准的详细解释:
在这里插入图片描述
接下来是2个示例:
在这里插入图片描述
还有提示:
在这里插入图片描述
其实这道题考察的是“去重算法”,即去除一个非递减序列的重复项。举个很简单的例子,把[0 0 1 2 2 2 3 4 4 5]变成类似[0 1 2 3 4 5]这样就行了。大家可以先思考一下,再来听我讲解。

这种考察数组的题目,大部分都是采用“双指针”或者“双下标”的方法。这里我用“双下标”的思路来讲解。

首先需要有2个下标。第一反应:2个下标都是0可不可以?我们顺着这个思路想一想:这道题是“去重”,所以一定要判断2个下标对应的元素是不是“相同”,因为“相同”意味着“重复”。如果2个下标一开始都是0,那就没有比较的意义了,因为这是同一个元素,一定是相等的。

所以,最好是2个下标一前一后。假设一个下标是0,另一个下标是1,这样这2个下标对应的元素就有了比较的意义。

下面再提一下大部分“双下标”思路的共性:一般都有一个是dst,表示目标;另一个是src,表示源头。目标一般标识“可以存储有效数据的位置”,源头一般是用来遍历数组的。

所以,我们的思路是:dst负责记录最后一个有效数据的位置,因为第一个数据一定是有效的,所以一开始初始化成0很合理。src则负责遍历数组,如果找到“有效”的数据,就存储在dst的位置后面。什么是“有效”的数据呢?和前面的数据不重复就是有效的数据了。

先搭个架子:

int removeDuplicates(int* nums, int numsSize){
    int dst = 0; // 标识最后一个有效数据
    int src = 1; // 遍历数组
    while (src < numsSize)
    {
        if (nums[src] == nums[dst])
        {
            // src无效
        }
        else
        {
            // src有效
        }
    }
}

那src“有效”和“无效”时分别应该如何处理呢?

如果数据无效,直接跳过这个数据即可;如果数据有效,那么就把这个数据存储在当前dst的数据后面,因为dst标识最后一个有效数据。

最后return什么呢?因为dst是最后一个有效数据的下标,+1就是有效数据的个数。

int removeDuplicates(int* nums, int numsSize){
    int dst = 0; // 标识最后一个有效数据
    int src = 1; // 遍历数组
    while (src < numsSize)
    {
        if (nums[src] == nums[dst])
        {
            // src无效
            ++src;
        }
        else
        {
            // src有效
            nums[++dst] = nums[src++];
        }
    }

    return dst + 1;
}

在这里插入图片描述
这样就通过了,非常完美。

总结

  1. 数组问题善用“双下标”法。
  2. 要明白“双下标”中每个下标的意义,本题中,一个标识最后一个有效数据,另一个用来遍历。

感谢大家的阅读!


http://lihuaxi.xjx100.cn/news/1102178.html

相关文章

HBASE入门 基本shell命令(一)

一、登录连接shell $HBASE_HOME/bin/hbase shell二、基本命令 2.1help命令 help创建命名空间 create_namespace bigdata;查看命名空间 list_namespace命名空间default和habase是系统自带的 三、DDL 3.1创建表 create bigdata:student, {NAME > name, VERSIONS> 5}…

nvm管理node版本与node对应的npm的版本

五一长假回来打开电脑发现自己的vscode不能成功运行项目&#xff0c;npm run dev之后没有任何反应&#xff0c;于是我想着使用cmd打开试试&#xff0c;结果cmd打开后画面只有一个横着的光标再闪&#xff0c;停几秒后就自动关闭了&#xff0c;看其他的博主写的解决方法一一试过了…

npm install 安装包时,常用的-S 、-D 、-g与直接npm 有什么区别?

一、主要区别就是依赖配置写入package.json文件的位置不同而已 npm install 本身就有一个别名 npm i &#x1f449; npm i module_name -S 即 npm install module_name --save 写入dependencies&#xff0c;发布到生产环境 这样安装是局部安装的&#xff0c;会写进…

CentOS 7.x 安装 ZooKeeper 并实现集群搭建

0. 集群结构 服务器IPhostname节点说明192.168.31.101master主节点192.168.31.102slave1从节点192.168.31.103 slave2 从节点 下面的安装与配置操作需要在三台服务器上都执行一遍。 1. 安装JDK ZooKeeper要求运行在 JDK 环境上&#xff0c;JDK安装教程可参考 CentOS 7.x 安装…

Wireless-Sensor-Network-master_WSN_无线传感网络(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 近年来&#xff0c;随着对等网络、云计算和网格计算等分布式环境的发展&#xff0c;无线传感器网络&#xff08;WSN&#xff0…

33. Kubernetes 核心组件讲解——etcd

本章讲解知识点 etcd 概述Raft 原理简介etcd 其他应用场景etcd 不算 Kubernetes 自研组件,etcd 自身是一个开源组件,Kubernetes 集成了它而已。但我们还是有必要讲讲 etcd。 1. etcd 概述 1.1 概述 etcd 是一个高可用的分布式键值存储系统,被用来存储 Kubernetes 集群中的…

Vuex从了解到实际运用(二)——获取vuex中的全局状态(state getters)

vuex从了解到实际运用——获取vuex中的全局状态state getters 知识回调&#xff08;不懂就看这儿&#xff01;&#xff09;场景复现项目实战vuex定义一个store实例在store中定义数据在组件中获取值vuex的计算属性通过getters获取全局状态state和getters获取全局状态的区别 知识…

【边缘设备】yolov5训练与rknn模型导出并在RK3588部署(亲测有效)

保姆级教程&#xff0c;看这一篇就够用了 环境准备 将宿主机和开发板接入同一个局域网&#xff0c;方便开发。 宿主机 PC电脑&#xff0c;x86_64, 带显卡, 配置不表, 能训练和开发即可。系统&#xff1a; ubuntu 22.04 LTS 版本( ubuntu 18.04 LTS 以上)自带的远程软件&…