双指针法的应用实战
什么是双指针?
双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。
快慢指针示例:
26-删除排序数组中的重复项
这里是定义快慢两个指针。快指针每次增长一个,慢指针只有当快指针上的值不同时,才增长一个(由于是有序数组,快慢指针值不等说明找到了新的值)
public int removeDuplicates(int[] nums) { int k = 0;//在nums中[0,k]中的数字无重复 //遍历第i个元素后,保证[0……i]中的所有不重复元素都 //按照顺序排列在[0……k]中 for (int i = 1; i < nums.length; i++) if(nums[i] != nums[k] ) nums[++k] = nums[i]; return k+1; }
27-移除元素
该题也是定义快慢两个指针。快指针每次增长一个,慢指针只有当值不同时才增长一个。
public int removeElement(int[] nums, int val) { int k = 0;//在nums中[0,k)中的数字不等于val //遍历第i个元素后,保证[0……i]中的所有不等于val的元素都 //按照顺序排列在[0……k)中 for(int i = 0;i < nums.length;i++) if(nums[i] != val) { int temp = nums[i]; nums[i] = nums[k]; nums[k++] = temp; } return k; }
80-删除排序数组中的重复项 II
该题为双指针问题的进阶版,设置了三个指针。一个快指针,一个慢指针,一个定位指针。快指针每次增长一个,当快指针与定位指针的值不同时,则更新定位指针的指向快指针。只要快指针与定位指针的距离小于2则慢指针增长一位。
public int removeDuplicates2(int[] nums) { //在nums中[0,k)中的数字未重复两次以上 //j作为开头的坐标,以计算重复的个数 int j = 0,k = 0; //遍历第i个元素后,保证[0……i]中的所有未重复两次以上元素都 //按照顺序排列在[0……k)中 for (int i = 0; i < nums.length; i++) { //主要通过坐标定位,将超过两个以上的数字排除掉 if(nums[i] != nums[j]) j=i; if((i-j) < 2 ) nums[k++] = nums[i]; } return k; }