本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
一、题目描述:
给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组,并在使用 O(1) 额外空间的条件下完成。
示例 1:
输入:nums = [1,1,1,2,2,3]
输出:5, nums = [1,1,2,2,3]
解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。 不需要考虑数组中超出新长度后面的元素。
示例 2:
输入:nums = [0,0,1,1,1,1,2,3,3]
输出:7, nums = [0,0,1,1,2,3,3]
解释:函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3 。 不需要考虑数组中超出新长度后面的元素。
来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/re…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
其实,做题是讲究套路的,这也印证了很多大佬说力扣刷上三百道题就可以掌握规律。这个规律说白了就是做题的一些套路。
就像这道题,其实我们看到有序和数组这两个关键词就应该联想到用双指针去解决。
- 利用双指针,左指针暂时固定不动,右指针不断移动
- 创建一个
count值记录出现过的相同数字的次数 - 当两个指针指向的值相同时
count值+1,并且判断count值是否大于等于3,如果是就删除该元素,并且更新count值和右指针 - 如果两个指针不相等,则说明遇到了新的值,则将左指针更新到右指针的位置,重置
count值为1,因为左指针移动到右指针时就说明该值已经出现了一次 - 遍历完成,返回数组长度即可
(高能!灵魂画手上线)
三、AC 代码:
/**
* @param {number[]} nums
* @return {number}
*/
var removeDuplicates = function(nums) {
// 左指针
let l = 0;
// 右指针
let r = 0;
// 初始次数
let count = 0;
// 遍历数组
while(r < nums.length){
// 如果两个指针指向的数字相同
if(nums[l] === nums[r]){
// 次数+1
count+=1;
// 判断次数是否大于等于3
if(count>=3){
// 是,就删除该元素
nums.splice(r,1);
// 更新count值
count-=1;
// 因为原数组已经被删除了一个元素,所以这里的右指针也要向后移动一位
r--;
}
// 指针指向的数字不同,就说明遇到了新的值,则更新左指针和count值
}else {
l = r;
count = 1;
}
// 不断移动右指针
r++;
}
// 返回数组的长度
return nums.length;
};
四、总结:
这道题时今天的每日一题,大家可以尝试一下,题目整体难度感觉还是比较简单的。
这道题是自己一遍做出来的,所以没怎么看题解,也没有采用题解的方案,可能题解做的更简单,但是我还是喜欢用我的套路,因为自己的思路理解起来是比较清晰的,所以建议大家做的时候也自己尝试一遍先~