LeetCode-26 题目描述

在题干中,我们可以获取到的主要信息有

  1. 有序并且原地修改数组,空间复杂度O(1),这个也就代表着我们不能使用其他数据结构,例如Set等
  2. 不需要考虑数组中超出新长度后面的元素

既然不用考虑超出新长度后边的元素那就可以非常简单的使用双指针,一个走的比较慢,一个走的比较快
走得慢的指针用来依次排列数据,走的快的可以验证是否重复

示例代码

public int removeDuplicates(int[] nums) {
    int nLen  = nums.length;
    if(nLen == 0 || nLen == 1){
        return nLen;
    }
    
    // j是走得慢的指针,i是走得快的指针
    int j = 0;
    
    for(int i=0; i<nLen; i++){
        if(nums[i] != nums[j]){
            nums[++j] = nums[i];
        }
    }
    
    return j+1;
}

LeetCode-27 题目描述

思路和上边那个题基本上是一模一样的,都是一快一慢双指针

示例代码

public int removeElement(int[] nums, int val) {
    int j = 0;
    for(int i=0; i< nums.length; i++){
        if(nums[i] != val){
            nums[j++] = nums[i];
        }
    }

    return j;
}