26. 删除有序数组中的重复项


双指针法

class Solution {
    public int removeDuplicates(int[] nums) {

        /**
         * 定义两个指针n和i,n指向左边没有重复元素子数组的最后一位,i指向当前遍历元素
         * 只有当后一个元素大于前一个元素时,才将其放入以n结尾的数组中
         * 最终返回的就是长度为n + 1的数组
         * 数组为空时需要单独考虑
         */
        
        if (nums == null || nums.length == 0){
            return 0;
        }
        
        int n = 0;

        for (int i = 1; i < nums.length; i++) {

            if (nums[n] < nums[i]){

                n++;
                nums[n] = nums[i];
            }
        }

        return n + 1;
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

优化1——避免重复的赋值

class Solution {
    public int removeDuplicates(int[] nums) {

        /**
         * 定义两个指针n和i,n指向左边没有重复元素子数组的最后一位,i指向当前遍历元素
         * 只有当后一个元素大于前一个元素时,才将其放入以n结尾的数组中
         * 最终返回的就是长度为n + 1的数组
         * 数组为空时需要单独考虑
         */

        if (nums == null || nums.length == 0){
            return 0;
        }

        int n = 0;

        for (int i = 1; i < nums.length; i++) {

            if (nums[n] < nums[i]){

                n++;
                
                /**
                 * 如果指向的是同一个元素就不用赋值
                 */
                if (n != i) {
                    nums[n] = nums[i];
                }
            }
        }

        return n + 1;
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/