【LeetCode】删除有序数组中的重复项 - 快慢指针

1,004 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

今天来刷两道数组题 来学学快慢指针的思想

26. 删除有序数组中的重复项【简单】

leetcode-cn.com/problems/re…

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

【解法一】快慢指针

快指针表示遍历数组到达的下标位置【遍历数组】 慢指针表示下一个不同元素要填入的下标位置【维持条件】

快指针 i 用来遍历一遍数组 慢指针 j 用来维护数组 【维护数组元素不重复的性质】 注意这里的判断条件,满足条件【元素不重复】,慢指针j才走

在这里插入图片描述

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

在这里插入图片描述

【解法二】双指针

这里利用了JavaScript的特性,就是数组越界的结果是undefined,不会报错

var removeDuplicates = function (nums) {
  let j = 0;
  for (let i = 0; i < nums.length; i++) {
    if (nums[i] !== nums[i + 1]) {
      nums[j] = nums[i];
      j++;
    }
  }
  return j;
};

在这里插入图片描述

也可以将遍历初始值+1,这样就不会出现数组越界了

var removeDuplicates = function(nums) {
    let j = 1
    for(let i = 1; i < nums.length; i++){
        if(nums[i] !== nums[i-1]){
            nums[j] = nums[i]
            j++
        }
    }
    return j
};

在这里插入图片描述

80. 删除有序数组中的重复项 II【中等】

leetcode-cn.com/problems/re…

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

与26题解题思路一致,就是多一个计数器

【解法】快慢指针

/**
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function(nums) {
	// j 用来维持一个满足条件的数组
    let j = 0;
    // 定义一个计数变量
    let count = 1;
    // 遍历nums数组
    for(let i = 0; i < nums.length; i++){
    	// 设置计数器
        if(nums[i] === nums[i+1]){
        	// 遇到和后一个元素相同的情况,计数器加1
            count++;
        }else{
        	// 与后一个元素不同,计数器重置为1
            count = 1;
        }
        // j维持一个数组
        if(count <= 2){
        	// 满足条件,j才移动【计数器大于2的时候j不动】
            nums[j] = nums[i];
            j++;
        }					
    }
    return j;
}; 

换一种数组不越界的写法

var removeDuplicates = function(nums) {
    let j = 1
    let count = 1
    for(let i = 1; i < nums.length; i++){
         if(nums[i] === nums[i-1]){
             count++
         }else{
             count = 1
         }
         if(count <= 2){
             nums[j] = nums[i]
             j++
         }
    }
    return j
};