【力扣-数组】删除有序数组中的重复项

210 阅读2分钟

「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战

删除有序数组中的重复项

题目描述

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

输入:nums=[1,1,2]
输出:2,nums=[1,2]
解释:函数应该返回新的长度2,并且原数组nums的前两个元素被修改为1,2。不需要考虑数组中超出新长度后面的元素。

示例2:

输入:nums=[0,0,1,1,1,2,2,3,3,4]
输出:5,nums=[0,1,2,3,4]
解释:函数应该返回新的长度5,并且原数组nums的前五个元素被修改为0,1,2,3,4。不需要考虑数组中超出新长度后面的元素。

解析
双指针法

  • 首先定义两个双指针fastIndex和slowIndex,它们都指向第一个元素。
  • fastIndex指针依次从左向右遍历,slowIndex指向第一个数组元素
    1. 当出现两个数组元素的值不相等时,fastIndex指向的数组元素的值赋值给slowIndex,slowIndex指针向右移动一位。
    2. 当出现两个元素的值相等时,fastIndex指针继续向右遍历,slowIndex不动
  • 最终当fastIndex遍历完所有的数组元素,有序数组中的重复项也被全部删除,此时slowIndex指针指向的数组元素下标就是最终数组的长度

注意题目中原地两个字,在计算机科学中,原地算法是一种使用小的,固定数量的额外之空间来转换资料的算法,这里就是指我们不要使用额外的数组空间
代码

class Solution {   
   public int removeDuplicates(int[] nums) {   
       //定义两个指针fastIndex,slowIndex
       int fastIndex=1;  
       //这里的slowIndex需要定义,可以不用赋值,方便后面能够返回值
       int slowIndex;   
       //两个指针初始化都指向第一个数组元素,fastIndex依次从左往右遍历
       for(slowIndex=1;fastIndex<nums.length;fastIndex++){  
           //当fastIndex遍历时,两个数组元素不相等时
           if(nums[fastIndex]!=nums[fastIndex-1]){
               //fastIndex指向的数组元素的值赋给nums[slowIndex]
                nums[slowIndex]=nums[fastIndex]; 
                //slowIndex指针向右移动一位
                slowIndex++;   
            }  
       }   
       //此时slowIndex指向的数组元素下表就是最终数组的长度
       return slowIndex;   
       }   
}