LeetCode7_数组双指针_有序数组元素去重、数组移除指定元素
发布日期:2021-05-07 20:40:32 浏览次数:11 分类:技术文章

本文共 1675 字,大约阅读时间需要 5 分钟。

题目1-有序数组元素去重


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

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

在这里插入图片描述

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

我的解答


  • 思路

嵌套循环,外层控制元素,判断 当前位置的 元素 是否和 近邻 的元素重复

若重复,进入内层循环,将 后面的全部元素 整个向前覆盖一步,即删除 重复的第一个元素

需要注意的是:

  • 当删除一个元素之后,数组的长度会减1,最后面的元素会不断复制元素,需要 统计 出现的重复 元素的个数(或者说是 整体移动的次数count,从而外层循环不在处理 整体移动 产生的 重复值)
  • 还需要处理 当连续出现 3个、4个或者更多的 重复元素的情况,每次移动之后,外层循环的i需要保持当前位置 即加上 i --
class Solution {       public int removeDuplicates(int[] nums) {           int count = 0;        for(int i = 0;i

题解之双指针


之前遇到的 链表双指针,判断链表是否有环(快慢指针) 、删除链表倒数第n个节点(间隔指针)

参考往期博客:

注意题目给的是有序数组,这样才能实现

思路

  • i作为下标 指针 处理 有效的元素,永远指向 最后一个有效元素
  • j作为另一个下标指指针 跑在 i 之前,
    • 遇到 和 nums[i]相等的元素,就 直接跳过,不用处理,对应ij的距离加一
    • 遇到和 nums[i]不相等的元素,就 i ++ 为有效元素找位置,然后 nums[i] = nums[j];
class Solution {       public int removeDuplicates(int[] nums) {           if(nums.length == 0){               return 0;        }        //双指针        int i = 0;        for(int j = 1;j

题目2-数组移除指定元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

在这里插入图片描述

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/remove-element
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


我的解答


在这里插入图片描述

有了双指针的思想,果然好实现多了,和上面的基本一样,

只不过需要注意的地方是

  • 对于 指定元素可以存在多个,对于处于 第一个位置 的情况,想要删除,需要 快指针 从j = 0开始
class Solution {       public int removeElement(int[] nums, int val) {           if(nums.length == 0){               return 0;        }        if(nums.length == 1 && nums[0] == val){               return 0;        }        //双指针        //需要注意的是 i 从 -1开始,即处理 nums[0] 存在待删除元素        int i = -1;        for(int j = 0;j
上一篇:LeetCode9_最大子序和(暴力、贪心、分治、动态规划)
下一篇:数据结构实验9_图的遍历(无向邻接矩阵图的构建、递归DFS、非递归DFS、非递归BFS)

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2025年03月29日 05时33分45秒