题目描述
给定一个已排序的数组,使用就地算法将重复的数字移除,使数组中的每个元素只出现一次,返回新数组的长度。
不能为数组分配额外的空间,你必须使用常熟级空间复杂度的就地算法。
例如,
给定输入数组 A=[1,1,2],
你给出的函数应该返回length=2,A数组现在是[1,2]。
涉及的知识点是:
就地算法:就地(In-place)算法指的是直接修改输入数据而不是将输入数据复制一份处理之后再覆盖回去,这个名称和时间复杂度没什么关系,纯粹是指算法处理数据的方式。比如一个冒泡排序就是就地算法。仅需要O(1)辅助空间的算法。通俗理解是:只在现有的数组里面进行操作,不在额外的开辟空间。
代码主要思路解析:
两个快慢指针,i和j,i为快指针,j为慢指针。i和j的起始位置都是数组的第一个位置。在满足循环判断条件的前提下,i开始一步一步的向前走,当i走一步,判断一下i和j所在的位置的数值是否相等,如果相等,i就继续进行i++操作,如果不相等,j就开始操作了,j先+1,然后j直接从当前位置到i当前的位置。i和j又同时指的同一个数值。就这样,一直到不满足循环条件,j+1 位此数组的不重复数据的长度。
下面是代码部分:
public class Main {
public static void main(String[] args) {
Main m = new Main();
int []num = {0,1,2,3,3,4};
System.out.println(m.removeDuplicates1(num));
}
//快慢指针:
public int removeDuplicates1(int[] nums){
if(nums == null ||nums.length == 0){
return 0;
}
int i = 0;
int j = 0;
for( ; i < nums.length; i++){
if(nums[j] != nums[i]){
nums[++j] = nums[i];
}
}
return j+1;
}
}