Leetcode双指针问题

1. 双指针的用法

        双指针主要用来遍历数组,利用双指针可以不开辟新的内存空间。两个指针指向不同的元素,协同地完成任务。    

          一个在前的指针quick,另一个在后的指针low,往同一个方向移动。此时,用low指针移动来存储由quick指针遍历时筛选所需存储的元素。


2.Leetcode第26题菜鸡解法

        这题给我的感觉就是,因为不能开辟新的内存空间来存储数组元素,所以刚开始不知道如何能够将删除后的数组保存下来。

        利用双指针的话,两个指针中的p1负责进行原先数组的遍历工作,另一个指针p2则可以负责存储工作;那么由p2负责的数组(为了方面理解,实际上为同一个数组)就是最终的所需结构,值得注意的是随着p1的遍历,当有新的符合条件的元素进p2负责的数组时,p2也需要++。

        实现细节:数组第一个元素不需要考虑,所以p2起始为1;由于要加上刚开始没考虑的第一个元素,所以最后return的是p2++;

26. 删除排序数组中的重复项

给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

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


3.Leetcode第80题菜鸡解法

分析:与26题大同小异,在26题基础之上加个count来技术并判断下就ok了;

看到的大神的解法,用slow-2巧妙将存储结果数组转换成最多两个相同元素的数组。 真的一“针”见血,牛啊

                if(nums[i] != nums[slow-2])

                nums[slow++] = nums[i];

80. 删除排序数组中的重复项 II

难度中等

给定一个增序排列数组 nums ,你需要在 原地 删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。

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

你可能感兴趣的:(Leetcode双指针问题)