该挑战主要是讲述了数组中的双指针的思想,以及针对一些数组的问题通过双指针思想进行解答。
原地移除所有数值等于val的元素
题目:LeetCode.27.给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。要求:不要使用额外的数组空间,你必须仅使用O()额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
方法一:快慢指针
/**
* 删除输出中的指定元素
*
* @param arr
* @param val
* @return
*/
public static int deleteByVal(int[] arr, int val) {
int slow = 0;
int fast = 0;
while (fast <= arr.length - 1) {
if (arr[fast] != val) {
arr[slow] = arr[fast];
slow++;
}
fast++;
}
return slow;
}
删除有序数组中的重复项
题目:LeetCode26给你一个有序数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(1)额外空间的条件下完成。
方法一:快慢指针
通过fast指针的移动,fast可以指向重复元素的最后一个,因此当fast和slow指针指向的元素不同时,就可以将slow向后移动一位然后将arr[fast]的值赋给arr[slow]
/**
* 删除数组中的重复元素
*
* @param arr
* @return
*/
public static int removeDuplicate(int[] arr) {
int slow = 0;
int fast = 0;
while (fast < arr.length - 1) {
fast++;
if (arr[fast] != arr[slow]) {
slow++;
arr[slow] = arr[fast];
}
}
return slow + 1;
}
方法二:官方方法,对快慢指针进行简化
/**
* 官方简化版
*
* @param arr
* @return
*/
public static int removeDuplicatePlus(int[] arr) {
int slow = 1;
for (int fast = 0; fast < arr.length; fast++) {
if (arr[fast] != arr[slow - 1]) {
arr[slow] = arr[fast];
slow++;
}
}
return slow;
}
思想是一样的,只不过实现起来简化了一些。省去了先对slow进行+1后赋值以及单独定义fast指针的操作。