Java for You 数据结构 删除有序数组中的重复项 | LeetCode 26

删除有序数组中的重复项 | LeetCode 26

题目描述

给你一个 非严格递增排列 的数组 nums ,请你原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

​

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

  • 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
  • 返回 k 。

​

判题标准:

系统会用下面的代码来测试你的题解:

如果所有断言都通过,那么您的题解将被 通过。

​

示例 1:

示例 2:

​

提示:

  • 1 <= nums.length <= 3 * 104
  • -104 <= nums[i] <= 104
  • nums 已按 非严格递增 排列

​

题目解析

有序序列去重的通用解法就是双指针技巧中的快慢指针技巧。

​

我们让慢指针 slow 走在后面,快指针 fast 走在前面探路,找到一个不重复的元素就告诉 slow 并让 slow 前进一步。这样当 fast 指针遍历完整个数组 nums 后,nums[0..slow] 就是不重复元素。

​

参考代码

以下为 Java 代码。

​

​

复杂度分析

​

  • 时间复杂度: O(n),其中 n 是数组的长度。快指针和慢指针最多各移动 n 次。
  • 空间复杂度: O(1)。
本文由 java4u.cn 发布,可自由转载、引用,但需署名作者且注明文章出处(作者:白色蜗牛,出处:java4u.cn)。如转载至微信公众号,请在文末添加作者公众号二维码。 https://java4u.cn/algorithms/3311.html

作者: 蜗牛

删除排序链表中的重复元素 | LeetCode 83

分隔链表 | LeetCode 86

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

联系我们

公众号:蜗牛互联网

在线咨询: QQ交谈

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部