【code基础】顺序数组的去重
掌握顺序数组的去重,对后续算法的去重剪枝,降低时间复杂度很有用,其基本思路如下:
1.双指针,k和i。其中k指向不重复的位置,i为数组的遍历指针
2.对数组进行遍历,其中i可以从1开始,k从0开始
3.比较nums[k]和nums[i]:
- 如果两者相同,移动i,k不变
- 如果两者不同,移动k,nums[k]=nums[i],这里需要理解,k所指的是纯粹的不重复的位置,我们只需要对k位置赋值就可,置于nums[i]位置,因为有重复,所以我们无须关注
@Test
//顺序数组的去重
public void sortDistinct(){
int[] nums = {0,0,1,1,1,2,2,3,3,4};
int k = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[k]!=nums[i]){
k+=1;
nums[k]=nums[i] ;
}
}
System.out.println(Arrays.toString(nums)); //[0, 1, 2, 3, 4, 2, 2, 3, 3, 4]
System.out.println(k); //4
int[] res = Arrays.copyOf(nums,k+1); //新数组长度为k+1
System.out.println(Arrays.toString(res)); //[0, 1, 2, 3, 4]
}
//k=0,i=1 k=0,i=2 k=1,i=3 k=1,i=4 k=1,i=5 k=2,i=6 k=2,i=7 k=3,i=8 k=3,i=9
//0,0 0,1 1,1 1,1 1,2 2,2 2,3 3,3 3,4
// k=1 k=2 k=3 k=4
// nums[1]=1 nums[2]=2 nums[3]=3 nums[4]=4
//0,0,.. 0,1,... 0,1,2 0,1,2,3 0,1,2,3,4