删除排序数组中的重复项
- 题目
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O (1) 额外空间的条件下完成。
- 示例
示例 1:
输入:给定数组 nums = [1,1,2]
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。你不需要考虑数组中超出新长度后面的元素。
示例 2:
输入:给定 nums = [0,0,1,1,1,2,2,3,3,4]
函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
你不需要考虑数组中超出新长度后面的元素。
- 解法一:双指针法 空间O(1) 时间O(n)
// 整体思路就是把slow指向的数组位置当成已经去重了的数组。
class Soultion{
public int removeDuplicates(int[] nums) {
// 定义慢指针
int slow = 0;
// 定义快指针;
int fast = 1;
while(fast < nums.length){
// 找不到重复元素,则慢指针+1
if(nums[slow] != nums[fast]){
slow++;
nums[slow] = nums[fast];
}
// 找到了重复元素,则跳过当前快指针所指向的元素,继续向下找不重复的元素。
fast++;
}
// slow从0开始,返回个数应该+1;
return slow+1;
}
}
- 其它方法: 双重遍历空间O(1)时间O(n)
def not_repeat_array_num_2(nums):
ret = 0
for key in nums:
for i in nums:
if i == key:
nums.remove(key)
ret += 1
return ret
def not_repeat_array_num_1(nums):
ret = 0
for key in nums:
// 主意这里的count() 导致时间复杂度较高
if nums.count(key) > 1:
nums.remove(key)
ret += 1
return ret