题目:给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
题意:比方说给你一个[1,1,2,3,4,4,5]的数组,你将其变成[1,2,3,4,5,X,X],整个数组元素个数不变,但返回的长度需要变成5.
解题思路:所以可以想到双指针法,数组完成排序后,我们可以放置两个指针 i 和 j,其中 i 是慢指针,而 j 是快指针。只要 nums[i] = nums[j],我们就增加 j以跳过重复项。
当我们遇到 nums[j]≠nums[i] 时,跳过重复项的运行已经结束,因此我们必须把nums[j]的值复制到 nums[i + 1]。然后递增 i,然后重复相同的过程,直到 j到达数组的末尾为止。
public int removeDuplicates(int[] nums) {
if (nums.length == 0) return 0;
int i = 0;
for (int j = 1; j < nums.length; j++) {
if (nums[j] != nums[i]) {
i++;
nums[i] = nums[j];
}
}
return i + 1;
}
复杂度分析
时间复杂度:O(n),假设数组的长度是 n,那么 i 和 j分别最多遍历 n 步。
空间复杂度:O(1)。
网友评论