Plain's Blog

休想打败我的生活🔥

LeetCode之从排序数组中删除重复项(RemoveDuplicates)

Plain's Avatar 2019-01-01 LeetCode

  1. 1. 题目描述
  2. 2. 要求
  3. 3. 示例
  4. 4. 实现
  5. 5. 总结

题目描述

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

Given a sorted array nums, remove the duplicates in-place such that each element appear only once and return the new length.

要求

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.

示例

1
2
3
4
5
给定数组 nums = [1,1,2], 

函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2

你不需要考虑数组中超出新长度后面的元素。

1
2
3
4
5
给定 nums = [0,0,1,1,1,2,2,3,3,4],

函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4

你不需要考虑数组中超出新长度后面的元素。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
public int removeDuplicates(int[] nums) {

int count = 1;

for (int i = 1; i < nums.length; i++) {
if (nums[i - 1] != nums[i]) {
nums[count++] = nums[i];
}
}

return count;

}

总结

数组首先是排好序的

使用两个指针icount, 其中count是慢指针,i为快指针

nums[i-1] = nums[i], 我们就增加i跳过重复项

nums[i-1] != nums[i], 此时遇到不同项,就让count++, 并把当前nums[i]的值赋给nums[count], 重复以上过程,直到到达nums.length就让所有不重复的值提到了前面。

复杂度分析

  • 时间复杂度:O(n), 假设数组的长度为n, 那么ij分别最多遍历n

  • 空间复杂度:O(1)

本文作者 : Plain
This blog is under a CC BY-NC-SA 3.0 Unported License
本文链接 : https://plain-dev.com/leetcode-RemoveDuplicates/

本文最后更新于 天前,文中所描述的信息可能已发生改变