【LeetCode】【C++】27. 移除元素 80.删除有序数组中的重复项Ⅱ

news/2024/9/24 7:24:33/

27. 移除元素

题目描述

详见LeetCode 27. 移除元素。

这是一道特别水的题,但是我第一时间没有想到正确的解答思路。

题目描述可以简述为,给定数组nums和元素val,原地删除nums中等于val的元素,并返回nums中不等于val元素的个数。

思路

一开始我确实想到了要使用双指针来做,但是我错误的将第二个指针设置到了nums的尾部,想要将等于val的元素直接和尾部的元素进行交换,这个思路有一个很大的问题在于,尾部的元素也可能等于val。

正确的双指针思路是,设置两个双指针,均从头开始对nums进行遍历,记作left和right。

如果nums[right] != val,意味着可以令nums[left] = nums[right],并将两个指针同时右移,否则只移动right指针。

最后left的值就是nums中不等于val的个数。

class Solution {
public:int removeElement(vector<int>& nums, int val) {int left = 0;int n = nums.size();for(int right = 0; right < n; right ++) {if(nums[right] != val) {nums[left] = nums[right];left ++;}}return left;}
};

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

题目描述

详见leetcode原题目。

与这道题相似的是26. 删除有序数组中的重复项,这两道题与27. 移除元素类似,都涉及到原地对数组进行操作,都可以使用双指针算法来解决。

这道题目可以简单描述为,给定一个单调不减的数组,请原地删除数组当中的元素,使得重复的元素不超过两个,并返回最终数组的长度。

思路

自己还是太菜了,菜就要多练,参考了LeetCode的题解才想明白。

这道题仍然使用双指针算法来求解,但是不需要插旗来检查当前保留的元素是否超过两个。

需要注意的是对题目的性质进行仔细考察,仔细观察后可以发现,当前仅当当前位置ii-2的元素不相同时,才需要对该位置的元素进行保留操作,这也一定程度上利用了数组的有序性。

因此可以设置两个指针,分别是慢指针slow和快指针fast,使用慢指针slow来对数组当中的元素进行移动,使用快指针fast来对整个数组进行检查。

将这两个指针均初始化为2,如果nums[slow - 2] != nums[fast],说明此时要对数组当中的元素进行移动,即令nums[slow++] = nums[fast]

上述语句看似非常简单,它为什么是合理的呢?考虑nums[slow - 1],如果它与nums[slow - 2]是相等的,注意题目给定的条件,至多保留两个相同的元素,我们无需对它进行操作。只有当nums[slow - 2]nums[fast]不相等的时候,才需要将fast指针处的元素移动到slow指针处。

举个例子,假设有数组[1, 1, 2, 2, 2, 3, 3, 3, 3, 3],初始化的slow和fast都是2,即指向数组的第三个位置。初始化为2的原因是不需要考虑0和1两个位置的元素,而这必然是满足题意的,可以保留。对于fast == 2这个位置,nums[slow - 2]的值是1,与2不等,可以将fast位置的元素移动到slow。此时fast继续移动,移动到下标为3的位置时,nums[slow-2]的值仍然是1,与2不相等,仍然可以将fast位置的元素移动到slow。注意此时slow的值为4,因为保留了两个值为2的元素,slow此时指向的是下一个可能要将元素移动过来的位置。

然而,继续移动fast可以发现,当fast移动到下标为4的位置时,nums[slow-2]的值是2,此时fast和slow - 2指向的元素相等了,由于新数组当中的元素重复的次数不能超过2,所以此时不能将fast位置的元素移动到slow。

继续移动fast至下标为5的位置,此时fast位置的元素为3,slow-2位置的元素为2,slow-1位置的元素也是2,可以将fast位置的元素移动到slow。

代码如下:

class Solution {
public:int removeDuplicates(vector<int>& nums) {int n = nums.size();if(n <= 2) {return n;}int slow = 2, fast = 2;while(fast < n) {if(nums[slow - 2] != nums[fast]) {nums[slow ++] = nums[fast];}fast ++;}return slow;}
};

http://www.ppmy.cn/news/1529709.html

相关文章

新提案:C++将变得内存安全

革命性的提案&#xff1a;C 将添加借用检查、生命周期、mut、sendsync 在遭受内存安全棒的打击两年后&#xff0c;C 社区发布了一项提案&#xff0c;以帮助开发人员编写更不容易受到攻击的代码。 Safe C 扩展提案旨在解决易受攻击的编程语言的致命弱点&#xff0c;即确保代码…

json Date格式化时间偏差8小时,而@JsonFormat注解有无法动态指定时区,如何解决?

use this method to set timezone and replace JsonFormat(pattern “yyyy-MM-dd HH:mm:ss”, timezone“GMT8”) (1)Model field JSONField(format DateTimeJsonFormatSerializer.TIME_FMT)//fastjson,JSON.toJSONString()JsonSerialize(using DateTimeJsonFormatSerializ…

如何从格式化的笔记本电脑或台式机中恢复照片

您想学习如何从已格式化的笔记本电脑或台式机中恢复已删除的照片吗&#xff1f;这篇文章解释了如何使用最佳格式的照片恢复软件来做到这一点。您可以通过简单的步骤格式化计算机后恢复已删除的图像。 将照片保存在笔记本电脑或 PC 硬盘上是很常见的。与相机存储卡和 USB 闪存驱…

排序----希尔排序

void ShellSort(int* a, int n) {int gap n;while (gap > 1){// 1保证最后一个gap一定是1// gap > 1时是预排序// gap 1时是插入排序gap gap / 3 1;for (size_t i 0; i < n - gap; i){int end i;int tmp a[end gap];while (end > 0){if (tmp < a[end]){…

企业EMS -能源管理系统-能源管理系统源码-能源在线监测平台

能源管理系统是以帮助工业生产企业在扩大生产的同时&#xff0c;合理计划和利用能源&#xff0c;降低单位产品能源消耗&#xff0c;提高经济效益&#xff0c;降低CO2排放量为目的信息化管控系统。 我国能源管理从上世纪80年代中期开始&#xff0c;通过“能量平衡测试”、“能源…

HDL coder使用手册

&#x1f4a1; 由于本科毕设女朋友准备使用FPGA完成&#xff0c;因此写这篇文章帮助她快速上手HDL coder的使用&#xff0c;降低前期入门的难度。 支持生成HDL代码的simulink库 名字中含有HDL的库中的模块一般都可以用来生成HDL代码。直接搜索模块名称&#xff0c;比如搜索fir&…

662. 二叉树最大宽度 BFS 力扣

662. 二叉树最大宽度 已解答 中等 相关标签 相关企业 给你一棵二叉树的根节点 root &#xff0c;返回树的 最大宽度 。 树的 最大宽度 是所有层中最大的 宽度 。 每一层的 宽度 被定义为该层最左和最右的非空节点&#xff08;即&#xff0c;两个端点&#xff09;之间的长…

vue入门小练习

文章目录 1.案例需求2.编程思路3.案例源码4.小结 1.案例需求 一个简易的计算器&#xff0c;其效果如下&#xff1a; 图片切换&#xff0c;其效果如下&#xff1a; 简易记事本&#xff0c;其效果如下&#xff1a; 2.编程思路 1.这个Vue.js应用实现了一个简单的计算器&#x…