题目链接力扣
难度:简单
一 题目大意
26. 删除有序数组中的重复项给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
将最终结果插入 nums 的前 k 个位置后返回 k 。
不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
class Solution {
public:int removeDuplicates(vector<int>& nums) {}
};
二 题目分析
思路:使用双指针算法
方法一
使用双指针中快慢指针算法,两个指针同向前进。快指针遍历整个数组,慢指针存储需要变换数值的数组位置,即存储快指针识别的第一个不同数值元素。
其中重要一点为如何判断数值为第一次出现。由于待处理数组为已经排好顺序,所以相同数值的元素排在一起。因此,如果num[i] != num[i-1],表示数值是第一次出现,需要在慢指针处存储,另外慢指针需要向前移动。
注意这种情况需要对一个元素进行处理:由于第一个元素一定为首先出现的元素,满足判断条件,因此可以直接采用或的条件判断方式。
对应代码
class Solution {
public:int removeDuplicates(vector<int>& nums) {int k = 0;for(int i = 0;i < nums.size();i++){if(!i || nums[i] != nums[i-1]){nums[k] = nums[i];k++;}}return k;}
};