【力扣】 删除有序数组中的重复项 双指针解题

简介: 删除有序数组中的重复项 双指针解题

题目描述


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


由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。


将最终结果插入 nums 的前 k 个位置后返回 k 。


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


判题标准:


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


int[] nums = [...]; // 输入数组
int[] expectedNums = [...]; // 长度正确的期望答案
int k = removeDuplicates(nums); // 调用
assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
    assert nums[i] == expectedNums[i];
}


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

 

示例


示例 1:


输入:nums = [1,1,2]
输出:2, nums = [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]

解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。  


提示:

0 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums 已按 升序 排列

题目分析


因为之前解过链表的删除重复项问题:删除排序链表中的重复元素

再解答这道题就简单多了,我仍然采用双指针的思路解题


思路讲解


  1. 老规则,先做为空判断
  2. 既然是双指针,我们定义两个指针,一个命名为slow,一个命名为fast
  3. 循环快指针,如果快指针的相邻的元素不相等,则把当前指针赋值给慢指针
  4. 如果相等的话则说明是重复项,就不赋值给慢指针
  5. 最后我们输出慢指针,慢指针就是不包含重复项的有序数组了


AC代码


func removeDuplicates(nums []int) int {
    n := len(nums)
    if n == 0 {
        return 0
    }
    slow := 1
    for fast := 1; fast < n; fast++ {
        if nums[fast] != nums[fast-1] {
            nums[slow] = nums[fast]
            slow++
        }
    }
    return slow
}


运行结果


微信图片_20221112165150.jpg


总结


复杂度分析


时间复杂度:O(n),其中 n 是数组的长度。快指针和慢指针最多各移动 n 次。

空间复杂度:O(1)。只需要使用常数的额外空间。

相关文章
|
8天前
|
存储
【合并两个有序数组】LeetCode第88题讲解
【合并两个有序数组】LeetCode第88题讲解
|
22小时前
|
存储 搜索推荐 C语言
Leetcode—合并两个有序数组—C语言
Leetcode—合并两个有序数组—C语言
|
22小时前
|
存储 C语言
Leetcode—— 删除排序数组中的重复项——C语言
Leetcode—— 删除排序数组中的重复项——C语言
|
8天前
leetcode代码记录(删除字符串中的所有相邻重复项
leetcode代码记录(删除字符串中的所有相邻重复项
14 0
|
8天前
leetcode代码记录(有序数组的平方
leetcode代码记录(有序数组的平方
11 0
|
8天前
leetcode代码记录(有序数组两数之和
leetcode代码记录(有序数组两数之和
15 0
|
8天前
【力扣】80.删除有序数组中的重复项Ⅱ
【力扣】80.删除有序数组中的重复项Ⅱ
|
8天前
|
存储
【力扣经典面试题】80. 删除有序数组中的重复项 II
【力扣经典面试题】80. 删除有序数组中的重复项 II
|
8天前
|
存储
【力扣经典面试题】合并两个有序数组
【力扣经典面试题】合并两个有序数组
|
8天前
|
存储 C语言
【C语言】Leetcode 88.合并两个有序数组
【C语言】Leetcode 88.合并两个有序数组
17 3

热门文章

最新文章