前言
最近在准备面试,在按照计划复习知识点,算法一直是我最薄弱的部分,正好看见掘金上有算法打卡活动,就想跟着一起写写,也算是对自己一个督促。刚开始做题,想从简单的开始循序渐进的做,选的都是相对简单的题目,这也是我第一次写解题思路~
今日题目
leecode26题:删除排序数组中的重复项
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
示例:
给定 nums = [0,0,1,1,1,2,2,3,3,4],
函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
你不需要考虑数组中超出新长度后面的元素。
分析题目
题目是一个有序数组, 也就是重复的项一定相邻,不能新声明数组
原地操作,不需要考虑数组中超出新长度后面的元素,理解为将数组中不重复项提取到数组左侧 let len = removeDuplicates(nums);
for (int i = 0; i < len; i++) { console.log(nums[i]); }
这是截取nums 的下标为len前的数据
所以此题将数组的不重复项提到数组左侧后,输出不重复项长度即可
解题思路
慢指针用来记录当前不重复的位置,快指针遍历数组
快慢指针数值相等时,说明该数值已经有了,慢指针不变,快指针继续下一个 快慢指针数组不等,说明该数值要记录下来,慢指针移动一位,该位置的数值为快指针位置数值
代码如下
var removeDuplicates = function(nums) {
if (nums.length == 0) return 0
let idx = 0 // 慢指针
for(let i = 1; i< nums.length; i++) {
if(nums[i] !== nums[idx]) {
nums[++idx] = nums[i]
}
}
return idx + 1
}
while循环写法
var removeDuplicates = function(nums) {
if (nums.length == 0) return 0
let slow = 0 // 慢指针
let fast = 1
while(fast < nums.length) {
if (nums[slow] !== nums[fast]) {
slow++
nums[slow] = nums[fast]
}
fast++
}
return slow + 1
};
总结
- 刚开始刷题感觉很陌生,感觉很简单的题目但是写起来总是写不对,觉得要系统的学习下算法与数据结构才行
- 这道题考察双指针,接下来的刷题准备先刷类似的题目,巩固知识点! p.s. 3月第二天了,抓紧加油了,老铁!!!
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情