壹 ❀ 引

本题来自LeetCode26. 删除有序数组中的重复项,是一道简单题,题目描述如下:

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝

int len = removeDuplicates(nums);

// 在函数里修改输入数组对于调用者是可见的。

// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。

for (int i = 0; i < len; i++) {

print(nums[i]);

}

示例 1:

输入:nums = [1,1,2]
输出:2, nums = [1,2]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

示例 2:

输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

提示:

  • 0 <= nums.length <= 3 * 104
  • -104 <= nums[i] <= 104
  • nums 已按升序排列

其实在去年,我已经做过了这道题的2.0版本并记录过题解JS Leetcode 80. 删除有序数组中的重复项 II题解,那么今天的这道题我们就快速过一遍,那么开始。

贰 ❀ 字典

其实不管数组是不是有序,我们都可以用一个字典用于记录已经出现的数字,如果它第一次出现,记录为true,反之如果已经被记录过,那么直接将当前数字从数组中剔除掉,思路很清晰,直接实现:

/**
* @param {number[]} nums
* @return {number}
*/
var removeDuplicates = function (nums) {
let dic = {};
let i = 0;
while (i < nums.length) {
// 如果为true,说明已存在,剔除数字
if (dic[nums[i]]) {
nums.splice(i, 1);
} else {
// 反之设置为true,让i自增
dic[nums[i]] = true;
i++;
};
};
return nums.length;
};

叁 ❀ 快慢双指针

其实在我上面贴的此题的2.0版本题解中也介绍了这种方法,当然支撑快慢指针的原因是因为题目中说了,不需要考虑数组中超出新长度后面的元素,也就是说:

[1,1,2,2,3]
//转为
[1,2,3,2,3]

我们只要保证转换完成的数组的前几位是符合题目要求的,后面超出的部分可以不需要管。

而双指针的做法,在于需要一个快指针和一个慢指针,慢指针总是在符合条件后修改当前指针的数字,之后才会自增,只要不符合它就原地不同,而快指针会从头到尾扫描一遍,目的是不断找下一个元素和慢指针所在的元素进行对比,这样才能让两个指针按照某种约定慢慢右移,而当完成转换之后,慢指针一定会指向最后一个合法的数字,所以返回慢指针就是最终答案了。

但需要注意的是,题目说最终允许X个相同数字存在时,那么数组前X个数字是不需要进行筛选的,这个逻辑会比较绕,我先贴上代码,再分析过程:

/**
* @param {number[]} nums
* @return {number}
*/
var removeDuplicates = function (nums) {
//定义可复用的函数,题目允许几个相同数字存在,x就是几
function process(nums, x) {
// 这里的s就是慢指针
let s = 0
// 这里的i是快指针
for (let i = 0; i < nums.length; i++) {
// s<x是因为前x个数字一定满足条件,满足前者即可,而只有超过了x个,才会走后面的判断看数字是否相等
if (s < x || nums[s - x] !== nums[i]) {
nums[s] = nums[i]
s++;
};
};
return s;
};
// 根据提议,x是1,最多允许1个相同数字存在
return process(nums, 1) };

我们以数组[1,1,2,2,3]为例,这个过程就像这样:

那么本篇文章就记录到这里了。

JS Leetcode 26. 删除有序数组中的重复项 题解分析,字典与快慢双指针的更多相关文章

  1. [LeetCode]26.删除有序数组中的重复项(Java)

    原题地址: remove-duplicates-from-sorted-array 题目描述: 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的 ...

  2. LeetCode 26. 删除有序数组中的重复项

    双指针法 分析: 设置两个指针:p1,p2,初始p1指向数组的第一个元素,p2指向第二个元素 1)如果p1的值 == p2的值,就让p2后移一位 2)如果p1的值 != p2的值,修改p1的下一个元素 ...

  3. 【LeetCode】26. 删除有序数组中的重复项

    26. 删除有序数组中的重复项 知识点:数组:排序:双指针: 题目描述 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度. 不要使用额外的 ...

  4. 前端与算法 leetcode 26. 删除排序数组中的重复项

    目录 # 前端与算法 leetcode 26. 删除排序数组中的重复项 题目描述 概要 提示 解析 算法 # 前端与算法 leetcode 26. 删除排序数组中的重复项 题目描述 26. 删除排序数 ...

  5. Java实现 LeetCode 26 删除排序数组中的重复项

    26. 删除排序数组中的重复项 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) ...

  6. 4.19——数组双指针——26. 删除有序数组中的重复项 & 27. 删除有序数组中的重复项II & 80. 删除有序数组中的重复项 II

    第一次做到数组双指针的题目是80: 因为python的List是可以用以下代码来删除元素的: del List[index] 所以当时的我直接用了暴力删除第三个重复元素的做法,大概代码如下: n = ...

  7. [LeetCode]26. 删除排序数组中的重复项(数组,双指针)

    题目 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下 ...

  8. [LeetCode] 26. 删除排序数组中的重复项

    题目链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/ 题目描述: 给定一个排序数组,你需要在原地删除重复 ...

  9. Leetcode 26.删除排序数组中的重复项 By Python

    给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. 示例 1 ...

  10. 【LeetCode】删除排序数组中的重复项&&移除特定元素【双指针,原地算法】

    给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. 示例 1 ...

随机推荐

  1. 机器学习-线性分类-支持向量机SVM-合页损失-SVM输出概率值-16

    目录 1. SVM概率化输出 2. 合页损失 1. SVM概率化输出 标准的SVM进行预测 输出的结果是: 是无法输出0-1之间的 正样本 发生的概率值 sigmoid-fitting 方法: 将标准 ...

  2. 概率图模型 · 蒙特卡洛采样 · MCMC | 非常好的教学视频

    https://www.bilibili.com/video/BV17D4y1o7J2?p=1 非常感谢!感觉学会一点了,应该能写作业了

  3. 文件传输中的MD5校验技术

    1. 文件的MD5校验简介 文件的MD5校验是一种常用的文件完整性验证方法.MD5(Message Digest Algorithm 5)是一种广泛应用的哈希算法,它能够将任意长度的数据转换为固定长度 ...

  4. [转帖]linux按行读取 (while read line与for-loop)

    https://cloud.tencent.com/developer/article/1655435 在linux下一般用while read line与for循环按行读取文件.现有如下test.t ...

  5. [转帖]【基础】HTTP、TCP/IP 协议的原理及应用

    https://juejin.cn/post/6844903938232156167 前言 本文将持续记录笔者在学习过程中掌握的一些 HTTP .TCP/IP 的原理,以及这些网络通信技术的一些应用场 ...

  6. [转帖]KingbaseES和Oracle数据类型的映射表

    随着数据库国产化的进程,Oracle向KingbaseES数据库的数据迁移需求也越来越多.数据库之间数据迁移的时候,首先遇到的,并且也是最重要的,就是数据类型之间的转换. 下表为KingbaseES和 ...

  7. [转帖]kubernetes Flannel网络剖析

    https://plantegg.github.io/2022/01/19/kubernetes_Flannel%E7%BD%91%E7%BB%9C%E5%89%96%E6%9E%90/ cni(Co ...

  8. [转帖]CPU Utilization is Wrong

    Brendan Gregg's Blog home CPU Utilization is Wrong 09 May 2017 The metric we all use for CPU utiliza ...

  9. nginx 负载均衡简单设置

    自己简单维护了一个 需要继续改进. user nobody; worker_processes auto; events { worker_connections 1024; } http { inc ...

  10. 各开发语言DNS缓存配置建议

    作者:翟贺龙 一.背景 在计算机领域,涉及性能优化动作时首先应被考虑的原则之一便是使用缓存,合理的数据缓存机制能够带来以下收益: 1.缩短数据获取路径,热点数据就近缓存以便后续快速读取,从而明显提升处 ...