给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。 由于在某些语言中不能改变数组的长度,所...

给定一个升序排列的数组 nums,请原地删除重复出现的元素,使每个元素只出现一次,并返回删除后数组的新长度。要求不能使用额外的空间,并且必须在原地修改输入数组。元素的相对顺序应该保持不变。

例如,给定 nums = [1,1,2],函数应该返回 length = 2,并且 nums 前两个元素应该是 1 和 2。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 题目描述: 给定一个升序排列数组 nums,要求原地删除重复出现元素,使每个元素只出一次返回删除数组长度元素相对顺序应该保持一致。 回答: 题目要求我们原地删除重复出现元素,也就是不能使用额外的空间,只能在原数组上进行操作。我们可以使用双指针的方法来解决这个问题。 定义两个指针 i 和 j,初始时 i 指向数组的第一个元素,j 指向数组的第二个元素。如果 nums[i] == nums[j],说明 j 指向的元素重复的,我们就将 j 向后移动一位。如果 nums[i] != nums[j],说明 j 指向的元素不是重复的,我们就将 i 向后移动一位,并将 nums[j] 的值赋给 nums[i],然后将 j 向后移动一位。这样,当 j 遍历完整个数组时,i 指向的就是数组的最后一个元素数组长度就是 i+1。 代码如下: ``` class Solution { public: int removeDuplicates(vector<int>& nums) { if (nums.empty()) { return 0; } int i = 0; for (int j = 1; j < nums.size(); j++) { if (nums[i] != nums[j]) { i++; nums[i] = nums[j]; } } return i + 1; } }; ``` ### 回答2: 首先理解题目要求,是给定一个升序排列数组,让我们在原地删除重复元素,使得每个元素只出一次,并返回删除数组长度。需要注意的是,要保持数组元素相对顺序不变。 解题思路是双指针法。我们设置两个指针,一个指针i从数组的第二个元素开始遍历,另一个指针j指向第一个元素。开始时,i和j都指向第一个不同的元素,然后遍历数组,如果i和j指向的元素相等,那么i向后移一位。如果i和j指向的元素不相等,就将i指向的元素复制到j+1的位置上,然后j向后移一位。重复这个过程,直到遍历到数组的末尾,这时候数组重复元素已经全部删除了。最后返回j+1表示删除重复元素数组长度。 代码如下所示: ```python class Solution: def removeDuplicates(self, nums: List[int]) -> int: if not nums: return 0 j = 0 for i in range(1, len(nums)): if nums[i] != nums[j]: j += 1 nums[j] = nums[i] return j + 1 ``` 时间复杂度是O(n),空间复杂度是O(1)。这个方法非常简单易懂,而且在LeetCode也具有很高的通过率。 ### 回答3: 题目描述: 本题的目的是要求对一个已经按升序排列数组进行去重复操作,保证每个元素出现一次,并且不会改变其他元素的排序和相对位置,并最终返回去重后的数组长度。 思路分析: 1. 首先考虑最简单的去重复办法:建立一个HashSet集合,然后遍历整个数组,把所有不重复元素都放入HashSet集合。每次遍历时,检查当前元素是否在集合出现过,如果没有出现过,则将其加入集合;否则,表示重复元素,直接跳过不做任何操作。 2. 但是题目要求不能用额外的空间,那么我们思考一下是否能够原地修改这个数组。由于数组已经是按照升序排列的了,所以,我们只需要维护前后两个指针(i和j),来扫描整个数组,检查是否有重复元素,如果有的话,我们将其删除即可。注意,题目要求删除的是重复元素,而不是所有出现元素,因此,在扫描的过程,我们只需要让指针i记录下找到的不重复元素的位置,然后将其与后面的相同元素覆盖即可。 代码实现: Java版 public int removeDuplicates(int[] nums) { int n = nums.length; if (n == 0) return 0; int i = 0, j = 0; while (j < n) { if (nums[i] == nums[j]) { j++; } else { nums[++i] = nums[j++]; } } return i + 1; } C++版 class Solution { public: int removeDuplicates(vector<int>& nums) { int n = nums.size(); if (n == 0) return 0; int i = 0, j = 0; while (j < n) { if (nums[i] == nums[j]) { j++; } else { nums[++i] = nums[j++]; } } return i + 1; } }; Python3版 class Solution: def removeDuplicates(self, nums: List[int]) -> int: n = len(nums) if n == 0: return 0 i, j = 0, 0 while j < n: if nums[i] == nums[j]: j += 1 else: nums[i+1] = nums[j] i += 1 j += 1 return i + 1 时间复杂度分析: 该算法的时间复杂度是O(n),其n为数组长度。假设数组有k个重复元素,那么每个元素最多被比较一次,因此,时间复杂度是O(n)。由于题目要求原地修改,所以空间复杂度是O(1)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值