leetcode数组专项习题:从排序数组中删除重复项

1、从排序数组中删除重复项
remove-duplicates-from-sorted-array: Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length.
Do not allocate extra space for another array, you must do this in place with constant memory.
For example,Given input array A =[1,1,2],Your function should return length =2, and A is now[1,2].
题目要求:给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
分析:在编写代码之前,关注题设的几点条件,这对我们把握题目重点,理解题意很重要。首先,给定的数组是排序的,这意味着我们在编写代码时不需要考虑对数组重新排序,这相当于是题目给的一个“方便”;其次,题设要求我们在原地删除重复的元素,不能够使用额外的数组空间。这就意味我们不能新建一个数组用于存放不重复的元素,从而得到最终长度。这也是本题的难点。
如何不适用额外数组空间删除元素呢?换个角度想,如果对数组nums进行遍历,设置一个用于计数的变量number, 每有一个新的数出现,就增加对number+1。也就是说,只需要比较nums[i]和nums[number]的大小即可。
分析之后,我们得到了如下代码:
public class Solution {
//在eclipse编写代码时方便调试,所以增加了mian入口,测试用,提交代码时可以不用这段
public static void main(String[] args) {
Solution sl = new Solution();
int []num = {0,1,1,2,2,3,3,4};
int len=sl.removeDuplicates(num);
System.out.println(len);
for(int i=0;i<len;i++)
{
System.out.print(num[i]);
}
}
public int removeDuplicates(int[] nums) {
//关注极端案例,可以使得代码更加“健壮”
if (nums.length == 0)
return 0;
int number = 0;
//不适用额外数组空间
for (int i=0; i < nums.length ; i++) {
if ( nums[i] != nums[number] ) {
number++;
nums[number] = nums[i];
}
}
number+=1;
return number;
}
}

猜你喜欢

转载自blog.csdn.net/weixin_43277507/article/details/88092307