数组「1」删除排序数组中的重复项|刷题打卡

237 阅读2分钟

前言

最近在准备面试,在按照计划复习知识点,算法一直是我最薄弱的部分,正好看见掘金上有算法打卡活动,就想跟着一起写写,也算是对自己一个督促。刚开始做题,想从简单的开始循序渐进的做,选的都是相对简单的题目,这也是我第一次写解题思路~

今日题目

leecode26题:删除排序数组中的重复项

给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

示例:

给定 nums = [0,0,1,1,1,2,2,3,3,4],

函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。

你不需要考虑数组中超出新长度后面的元素。

分析题目

  1. 题目是一个有序数组, 也就是重复的项一定相邻,不能新声明数组

  2. 原地操作,不需要考虑数组中超出新长度后面的元素,理解为将数组中不重复项提取到数组左侧 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
};

总结

  1. 刚开始刷题感觉很陌生,感觉很简单的题目但是写起来总是写不对,觉得要系统的学习下算法与数据结构才行
  2. 这道题考察双指针,接下来的刷题准备先刷类似的题目,巩固知识点! p.s. 3月第二天了,抓紧加油了,老铁!!!

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情