相关leetcode:
- 26. 删除有序数组中的重复项
思想:
双指针顾名思义就是运用两个指针进行遍历,而这指针又分为快指针和慢指针。
我们以Leetcode26 删除有序数组中的重复项为例。上题:
该题目的意思,就是说白了就是去重,得出去重后的数组以及返回删除后数组的新长度
要注意的是题目说明了只能使用O(1)的额外空间,以及只能在原数组上进行修改。这时候我们的双指针就派上用场了。
那么双指针具体怎么操作呢?
我们用一张图来演示一下,我们以输入数组[0,0,1,1,1,2,2,3,3,4]为例
开始时,我们设置了两个指针i和j,分别指向了0和1的位置,同时我们也设置了一个temp值,用于判断是否重复而保存的值。开始的时候我们让他等于数组的第一个元素。
让我们temp与N[i]的值进行比较,如果相等则i++
如果temp与N[i]的值不相等,此时位置j的值改变为i所在的位置的值,同时temp也改变为i所在的位置的值,然后我们i继续进行遍历,此时我们j的位置也要相应的往右移。j在右移的同时也在同步帮我们计算数组的长度,所以我们不用在定义一个变量用于存储数组长度。
完整代码如下:
class Solution {
public int removeDuplicates(int[] nums) {
int j = 1;
int temp = nums[0];
for(int i = 0;i < nums.length;i++){
if(nums[i] == temp){
continue;
}else{
nums[j] = nums[i];
temp = nums[i];
j++;
}
}
return j;
}
}