前面学习了数组基本操作,今天学习双指针在数组中的应用。
所谓的双指针其实就是两个变量,不是真的指针。
首先定义两个指针slow、fast。其中slow表示当前位置之前的元素都是不重复的,fast指针一直向后找,直到找到与slow位置不一样的,找到后就将slow向后移动一个位置,并将arr[fast]赋值给arr[slow],之后,之后fast继续向后找,循环执行,找完后,slow之前的元素就是单一的,这样就大大简化了数组去重的流程。
了解了双指针后,将双指针应用到实际中。
原地移除所有值等于val的元素
第一种:快慢双指针
定义两个指针slow、fast,其中slow之前的位置都是有效部分,fast表示当前要访问的元素
遍历时,fast不断向后移动:
当nums[fast]的值不为val,则将其移动到nums[slow++]处。
当nums[fast]的值为val,则fast继续移动,slow等待。
public static int removeElement(int nums[],int val){
int slow = 0;
for (int fast = 0; fast < nums.length; fast++){
if (nums[fast] != val){
nums[slow] = nums[fast];
slow++;
}else {
}
}
return slow;
}
第二种:对撞双指针
对撞指针又叫交换移除,思路就是在数组右侧找到不是val的值来顶替左侧是val的值。
以nums = [0,1,2,2,3,0,4,2],val=2为例。
public static int removeEle(int nums[],int val){
int right = nums.length - 1;
int left = 0;
for (left = 0;left < right;){
if ((nums[left] == val) && (nums[right] != val)){
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
if (nums[left] != val){
left++;
}
if (nums[right] != val){
right++;
}
}
return left;
}