LC.26 删除有序数组中的重复项 做题笔记
注: 本文是做题笔记,并不是原创题解,用于整理自己的思路,文中参考的代码都会标注出处
题目
参考题解
思路
解法1:双指针
题目要求O(1)的空间复杂度
题目要求删除数组中的重复的元素
题目中重复的元素总是连着的
题目中不考虑新长度之后的元素
将题目的要求转化为:我们需要遍历数组,并且将其中的重复项丢到后面
因此自然而然就想到了: 双指针!
一个指针用来遍历数组,另一指针用来交换 --》 因此是选择将两个指针的初始位置都放在数组起始位置,但两个指针的前进方式不同,
指针i 遍历数组
指针j , 始终指向有效数组的最后一个位置
也就是说我们要让指针j以前的元素(包括指针j指向的元素)都是不重复的元素,
而只有当指针i所指向的值和j不一致时,才将i的值添加到j的下一个位置(这个时候j指针才移动)
解法2:通解
下图是三叶姐的讲解,讲得非常清楚了
总结
大致的思路应该是
数组中存在重复元素,每种重复元素可能有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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步