双指针法的应用实战
什么是双指针?
双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。
快慢指针示例:
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;
}
来源:oschina
链接:https://my.oschina.net/CourageHe/blog/3195516