今天的目标:
多写几个题目,总结双指针
题目:
q1 lc27
解答如下:
class Solution {
public:int removeElement(vector<int>& nums, int val) {int left =0;for(int right = 0; right < nums.size() ; right++){if( nums[right] != val ){swap(nums[left] , nums[right]);left++;}}return left;}
};
学习到的点:
这个题目还有优化思路:
由于它只想把有用的返回,那碰到val,就把它和nums的最后一个位置交换,然后lenth-1,这样循环的次数可能会减少,对于变动不大的数组效率会大幅提高,挖坑,等把数组全部学完,把这种算法写一下。
q2 lc26
解答如下:
class Solution {
public:int removeDuplicates(vector<int>& nums) {int left = 0;int temp = -100000;//随便写一个超过nums[i]范围的数,使nums[0]可以被保存for(int right = 0; right < nums.size() ; right++){if(nums[right] != temp ){nums[left] = nums[right];left++;}temp = nums[right];}return left;}
};
其它学习到的点:
虽然和题目的思路是一样的,但是引入了一个temp的临时变量存储right上一时刻的值。
官方解答用java写得,解答如下:
public int removeDuplicates(int[] nums) {if (nums.length == 0) return 0;int i = 0;for (int j = 1; j < nums.length; j++) {if (nums[j] != nums[i]) {i++;nums[i] = nums[j];}}return i + 1;
}作者:LeetCode
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/solution/shan-chu-pai-xu-shu-zu-zhong-de-zhong-fu-xiang-by-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
细看它的解答,没有引入temp的临时值,但是有三个地方做了处理:
一个就是开头,让right 直接等于1;
另一个就是让nums[left]存储上一个值,如果发现了nums[right] != nums[left] ,就先把left往前走一步再存值;
最后一点, 返回值是 i+1, 因为它的i是已经处理完成的位置索引,这个索引+1才是真正的个数,而在我自己写得程序里面,i是即将要处理的位置,这个位置对应的索引值就是处理好的数组个数。
q3 lc80
做不出来我佛了,膝盖奉上呜呜呜,在链接里面有大佬的解题图示。大佬写得好简单呜呜呜
class Solution {
public:int removeDuplicates(vector<int>& nums) {int n = nums.size();if(n <= 2){return n;}int sp = 1;for(int fp = 2; fp < n; fp++){if(nums[fp] != nums[sp - 1]){nums[++sp] = nums[fp];}}return sp + 1;}
};作者:dexin
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array-ii/solution/c-shuang-zhi-zhen-dan-ci-sao-miao-tu-jie-by-dexin/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
上面三个题目分别用双指针,仅删除、留一个或者两个
总结:
1.用双指针 对 一个数组 进行各种操作。