我们首先将是善良的,这一点最要紧,然后是正直|

ASO2001

园龄:3年粉丝:0关注:2

LC.26 删除有序数组中的重复项 做题笔记

注: 本文是做题笔记,并不是原创题解,用于整理自己的思路,文中参考的代码都会标注出处

题目

LC.26 删除有序数组中的重复项

参考题解

三叶姐的题解

思路

解法1:双指针

题目要求O(1)的空间复杂度
题目要求删除数组中的重复的元素
题目中重复的元素总是连着的
题目中不考虑新长度之后的元素

将题目的要求转化为:我们需要遍历数组,并且将其中的重复项丢到后面
因此自然而然就想到了: 双指针!
一个指针用来遍历数组,另一指针用来交换 --》 因此是选择将两个指针的初始位置都放在数组起始位置,但两个指针的前进方式不同,
指针i 遍历数组
指针j , 始终指向有效数组的最后一个位置
也就是说我们要让指针j以前的元素(包括指针j指向的元素)都是不重复的元素,
而只有当指针i所指向的值和j不一致时,才将i的值添加到j的下一个位置(这个时候j指针才移动)

解法2:通解

下图是三叶姐的讲解,讲得非常清楚了

image.png

总结

大致的思路应该是
数组中存在重复元素,每种重复元素可能有n个,但我们最多保留K个,因此对于整个数组来说,前K个元素我们直接保留(前K个元素不违背“最多保留K个的元素”的要求)。
对于性质2: 首先记住 我们的要求是 最多保留K位,因此对于后面的任意数字,与当前写入的位置前面 的第K个元素进行比较,不相同则保留。这句话的意思是如果想要添加一个数,那么就从当前插入位置往前数K个元素(如果数到的元素和要插入的数字不相同,说明要插入的数字仍然满足最多保留k个的要求)

代码

双指针

class Solution {
    public int removeDuplicates(int[] nums) {
        int n = nums.length;
        int j = 0; // 定义用来交换的指针
        for (int i = 0; i < n; i++) { // 定义用来进行数组遍历的指针
            if (nums[i] != nums[j]) {
                nums[++j] = nums[i]; //当指针i指向的值和j不一样时,才将j指针的下一位改为i的值,并将j++
            }
        }
        return j + 1;
    }
}

作者:AC_OIer
链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/solution/shua-chuan-lc-jian-ji-shuang-zhi-zhen-ji-2eg8/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

代码来自:宫水三叶

通解

class Solution {
    public int removeDuplicates(int[] nums) {   
        return process(nums, 1);
    }
    int process(int[] nums, int k) {
        int idx = 0; 
        for (int x : nums) {
            if (idx < k || nums[idx - k] != x) nums[idx++] = x;
        }
        return idx;
    }
}

作者:AC_OIer
链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/solution/shua-chuan-lc-jian-ji-shuang-zhi-zhen-ji-2eg8/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文作者:ASO2001

本文链接:https://www.cnblogs.com/JiShi2001/p/16388937.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   ASO2001  阅读(24)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起