【前端算法每日一题】leetcode-026-删除有序数组中的重复项

94 阅读1分钟

题目描述

  • 给你一个 升序排列 的数组 nums ,请你 原地删除 重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
  • 考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:
    • 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
    • 返回 k 。

解题思路

  • 双指针法(快慢指针)
  • 注意题目升序排列(保证重复元素都是挨着的)、原地删除(使用双指针的判断标志)
  • 快指针遍历元素
  • 慢指针记录非重复元素

解题代码(JavaScript)

var removeDuplicates = function (nums) {
  // 数组长度
  let len = nums.length;
  // 慢指针
  let slow = 0;
  // 快指针
  let fast = 0;
  while (fast < len) {
    if (nums[fast] === nums[slow]) {
      // 快指针元素与慢指针元素相同时,快指针向右移动
      fast++;
    } else {
      // 不相同时
      // 简便写法
      // nums[++slow] = nums[fast++];
      // 慢指针向右移动
      slow++;
      // 将慢指针元素替换为快指针元素
      nums[slow] = nums[fast];
      // 快指针向右移动
      fast++;
    }
  }
  return slow + 1;
};