本题给你升序数组,需要你原地 删除数组中的重复部分,返回相对顺序保持一致的新数组
对于我这样的算法小白而言,真的是没有任何思路,只能用拙劣的思维去考虑(大佬轻喷...)
我的脑海中是有个大概的感觉:应该是双指针可以很快的解决 但是奈何我一句也憋不出来
我只好去卑微的看题解了....
public class eazy26 {
public static void main(String[] args) {
int[] a = {0,0,1,1,1,2,2,3,3,4};
System.out.println(removeDuplicates(a));
}
public static int removeDuplicates(int[] nums) {
int n = nums.length;
int slow=1,fast=1; //定义双指针;
while (fast<n){
if(nums[fast-1]!=nums[fast]){
nums[slow] = nums[fast];
slow++;
}
fast++;
}
return slow;
}
}
运行结果: 5
我的理解:
首先定义双指针,一个快指针,一个慢指针;慢指针指向数组中等待替换的位置,如000012 这个数组,第一轮的慢指针指向1位置即第二个0,快指针每次循环都要往后指一位,目的是判断是否相等,由于它变化快,所以命名快指针。
当fast<n则进入循环,当后一位不等于前一位的时候,就需要去替换慢指针。然后让满指针指向下一位,如果相等的话,无所谓,我们只需要让快指针进行下一次比价即可。直到遇到不相等的,便去替换。然后slow再加1。当fast大于n后,就说明整条数组都遍历完了,数组已经删除完毕。最后返回一个slow,由于每次替换后,就相当于最终数组个数多一个。这个slow即使代表着数组的下标(指针作用),控制着替换的对应元素,同时也是代表着新数组的个数。这个逻辑很重要。
本题最大的限制是原地操作,也就是说,空间复杂度必须是O(1) ! 即不能额外开辟空间去存储数组元素!所以就需要用到指针的概念了,虽然在Java中,已经明确删除指针,但是我认为这里的指针不是工具,而是一种思想!
新手小白,请大佬指正!