给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:
更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。 返回 k 。
本文的背景来自于解决 LeetCode 26
、LeetCode 80
两个题目
其实社区已经有比较好的解题思路了,比如 【宫水三叶】关于「删除有序数组重复项」的通解
。
我个人觉得蛮好的,但是此篇还是记录自己的理解和学习~
拿第 26
题来做个讲解:
给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:
更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。 返回 k 。
核心思想是:双指针,定义快慢指针,快指针用来“扫栈”,慢指针用来“标记唯一元素”。
所以,顾名思义,慢指针不一定等于快指针,因为会去重。
比如一组输入为:[0,1,1,2,3,3]
索引 | 值 | 对比轮次 | 快指针 | 慢指针 |
---|---|---|---|---|
0->1 | 0->1 | 1 | 1 | 1 |
1->2 | 1->1 | 2 | 2 | 1 |
2->3 | 1->2 | 3 | 3 | 2 |
3->4 | 2->3 | 4 | 4 | 3 |
4->5 | 3->3 | 5 | 5 | 3 |
同比,咱们根据“规律法”做通解方法:
0.16%的用户使用了此解法~