题目
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
分析
- 空间为O(1) =》则可以使用双指针在数组上操作
- 因为是有序数组,所以重复的元素一定在一起,因为最多保留2位,所以如果nums[j-2]===nums[i],则说明 j-2 到 i的所有元素都相同。于是只有当nums[i] !== nums[j - 2] 的时候才替换元素
解法:双指针
*/
/**
* @param {number[]} nums
* @return {number}
*/
var removeDuplicates = function (nums) {
//特殊情况
if (nums.length < 2) return nums.length;
// 两个指针 j 和i, j永远指向等待被替换的那个元素的位置上, i则是探针 看看当前nums[i]需不需要替换掉nums[j]
let j = 2;
for (let i = 2; i < nums.length; i++) {
if (nums[i] !== nums[j - 2]) {
nums[j] = nums[i];
j++;
}
}
return j;
};
//时间复杂度:O(n)
//空间复杂度:O(1)
总结
今天这道题是主要是练习使用双指针来除去多余的数字类题目,这道题和 26.删除重复数组项很相似.
大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢
大家如果对“TS”感兴趣的可以看看我的专栏 (TypeScript常用知识),感谢大家的支持
文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com
\