26有序数组去重

313 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目
描述:
给你一个升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。 将最终结果插入 nums 的前 k 个位置后返回 k 。不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
比如给定数组[0, 0, 2, 3, 3, 3, 5, 5], 应该返回4,数组前四位为:0,2,3,5
难度:简单
链接 著作权归领扣网络所有。

二、思路分析:
1、原地修改,限制不可再新建一个数组,要在原有数组上操作。若无该限制,前端的常规操作估计是 Array.from(new Set(nums))
2、由于数组升序排列,故重复元素必然连续出现。不会出现 index 为 i 的元素和 i-1 元素不相同,但却与 i - n 相同的情况。可作为出现新元素的判断。

故遍历整个数组,每当出现与前一个元素不相同的新元素时,返回计数值 res 加 1,同时把 nums[res - 1] 的值赋值为当前新元素。

三、AC 代码:

/**
 * @param {number[]} nums
 * @return {number}
 */
const removeDuplicates = function(nums) {
  let len = nums && nums.length;
  if(len) {
    let p = 0;
    for(let i=1; i < len; i++) {
      if (nums[i] !== nums[p]) {
        p++;
        nums[p] = nums[i]; 
      }
    }
    return p + 1;
  } else {
    return 0;
  }
};

四、总结:

快慢指针,快指针 i 用于遍历,慢指针 p 处理数组值 + 计数。