LeetCode 关于 「删除有序数组重复项」的通解

不换
2024-04-15 01:59
阅读2.75分钟

本文的背景来自于解决 LeetCode 26LeetCode 80 两个题目

其实社区已经有比较好的解题思路了,比如 【宫水三叶】关于「删除有序数组重复项」的通解

Preview

我个人觉得蛮好的,但是此篇还是记录自己的理解和学习~

拿第 26 题来做个讲解:

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

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

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

function removeDuplicates(nums: number[]): number {
    const n = nums.length;
    if(n <= 1)  return n;
    let slow = 1, fast = 1;
    while(fast < n) {
        if(nums[slow-1]!==nums[fast]) {
            nums[slow] = nums[fast];
            ++slow;
        }
        ++ fast;
    }
    return slow;
};

核心思想是:双指针,定义快慢指针,快指针用来“扫栈”,慢指针用来“标记唯一元素”。

所以,顾名思义,慢指针不一定等于快指针,因为会去重。

比如一组输入为:[0,1,1,2,3,3]

索引对比轮次快指针慢指针
0->10->1111
1->21->1221
2->31->2332
3->42->3443
4->53->3553

同比,咱们根据“规律法”做通解方法:

function commonResolver(k: number)  {
    return function removeDuplicates(nums: number[]): number {
               const n = nums.length;
               if(n <= k)  return n;
               let slow = k, fast = k;
               while(fast < n) {
                   if(nums[slow-k]!==nums[fast]) {
                       nums[slow] = nums[fast];
                       ++slow;
                   }
                   ++ fast;
               }
               return slow;
           };
}
 

Preview

Preview

0.16%的用户使用了此解法~

Preview

不换
不换
中国.上海