1. 双指针的用法
双指针主要用来遍历数组,利用双指针可以不开辟新的内存空间。两个指针指向不同的元素,协同地完成任务。
一个在前的指针quick,另一个在后的指针low,往同一个方向移动。此时,用low指针移动来存储由quick指针遍历时筛选所需存储的元素。
2.Leetcode第26题菜鸡解法
这题给我的感觉就是,因为不能开辟新的内存空间来存储数组元素,所以刚开始不知道如何能够将删除后的数组保存下来。
利用双指针的话,两个指针中的p1负责进行原先数组的遍历工作,另一个指针p2则可以负责存储工作;那么由p2负责的数组(为了方面理解,实际上为同一个数组)就是最终的所需结构,值得注意的是随着p1的遍历,当有新的符合条件的元素进p2负责的数组时,p2也需要++。
实现细节:数组第一个元素不需要考虑,所以p2起始为1;由于要加上刚开始没考虑的第一个元素,所以最后return的是p2++;
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
3.Leetcode第80题菜鸡解法
分析:与26题大同小异,在26题基础之上加个count来技术并判断下就ok了;
看到的大神的解法,用slow-2巧妙将存储结果数组转换成最多两个相同元素的数组。 真的一“针”见血,牛啊
if(nums[i] != nums[slow-2])
nums[slow++] = nums[i];
难度中等
给定一个增序排列数组 nums ,你需要在 原地 删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。