【LeetCode26】删除排序数组中的重复项(双指针)

简介: 法一:直接使用stl的vector的unique去重,该去重函数不是直接删除重复元素,而是将相邻且重复的元素放入到vector的尾部,然后返回指向第一个重复元素的迭代器,所以要用erase删除尾巴的那些重复元素再统计size。

1.题目

image.pngimage.png


就地删除即不能辅助多余数组空间。


2.法一:STL的unique

法一:直接使用stl的vector的unique去重,该去重函数不是直接删除重复元素,而是将相邻且重复的元素放入到vector的尾部,然后返回指向第一个重复元素的迭代器,所以要用erase删除尾巴的那些重复元素再统计size。

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        nums.erase(unique(nums.begin(),nums.end()),nums.end());
        return nums.size();
    }
};

3.法二:双指针

法一是偷鸡,法二才正经哈哈。这题双指针和【LeetCode27】移除元素(双指针)类似,和27题不同的是这题j先加1后赋值,最后返回值注意j只是下标,求个数j还要1。

i为快指针,j为慢指针。

初始j在下标0,i先到下标1:

(1)如果相同则i不用理——i前进一格;

(2)如果不相同则j前进一格,i所在的元素复制给j现在的位置。


如下图:当快指针指向元素和慢指针相同时,慢指针不用动,快指针继续前进一格。而下一步当快指针到了元素4时,就需要扩充0到slow的范围(即慢指针+1后),将fast的元素仍进slow的元素。

image.png

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        if(nums.size()==0)
            return NULL;
        int j=0;//i为快指针,j为慢指针
        for(int i=1;i<nums.size();i++){
            if(nums[i]!=nums[j]){
                j++;
                nums[j]=nums[i];
            }
        }
        return j+1;
    }
};
相关文章
|
1月前
|
C语言
指向结构体数组的指针
指向结构体数组的指针
13 2
|
1月前
|
存储 算法 C语言
通过指针引用数组元素
通过指针引用数组元素
20 0
|
1月前
|
C语言 C++
数组元素的指针
数组元素的指针
10 0
|
1月前
|
存储 C++
使用字符指针变量和字符数组的比较
使用字符指针变量和字符数组的比较
10 0
|
1月前
|
算法
【数组相关面试题】LeetCode试题
【数组相关面试题】LeetCode试题
|
2天前
|
存储 人工智能 C++
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
25 1
|
3天前
|
存储 C语言
指针数组作为main函数的形参
指针数组作为main函数的形参
12 0
|
10天前
【力扣】80.删除有序数组中的重复项Ⅱ
【力扣】80.删除有序数组中的重复项Ⅱ
|
10天前
|
C++
【力扣】2562. 找出数组的串联值
【力扣】2562. 找出数组的串联值
|
23天前
|
存储
【力扣经典面试题】80. 删除有序数组中的重复项 II
【力扣经典面试题】80. 删除有序数组中的重复项 II

热门文章

最新文章