题目链接:
26. 删除有序数组中的重复项 - 力扣(LeetCode)
思路分析:同样是双指针问题,和之前的27题很像(LeetCode27.移除元素-CSDN博客,大家可以参考这个),这道题目的升级之处在于我们需要妥善处理好重复出现的元素的关系,所以引入了快慢指针,快指针负责全局遍历,慢指针来删除不需要的元素。
算法分析:在思路里面已经讲了一部分,就是设置快慢指针,然后快指针负责全局移动(要遍历一遍数组),慢指针负责进行处理,每当移动到快指针发现相邻两个元素不相等时,就需要慢指针进行特判。
参考代码:
cpp
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int n=nums.size();//数组的长度
if(n==1)//进行一个特判 方便后面用快慢指针
return 1;
int slow=1,fast=1;//快慢指针开始都初始化为1
while(fast<n){//快指针没有遍历完
if(nums[fast]!=nums[fast-1]){//如果相邻两个元素不相等
nums[slow]=nums[fast];//把变换的元素的值赋值给慢指针
slow++;//慢指针向后移动
}
++fast;//快指针每一轮都要移动
}
return slow;//慢指针代表了不同元素的个数
}
};