【LeetCode】80. 删除排序数组中的重复项 II

题目描述

 

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

示例 1:

  1. 给定 nums = [1,1,1,2,2,3],
  2. 函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1,1,2,2,3.
  3. 你不需要考虑数组中超出新长度后面的元素。

示例 2:

  1. 给定 nums = [0,0,1,1,1,1,2,3,3],
  2. 函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0,0,1,1,2,3,3.
  3. 你不需要考虑数组中超出新长度后面的元素。

通过设置有效数字长度和同一数字出现的次数来控制逻辑的判断

public static int removeDuplicates(int[] nums) {
        // 有效的数字长度
        int length = 0;
        // 指针
        int i = 0;
        // 同一数字出现的次数
        int sim = 1;
        for (int j = 1; j < nums.length; j++) {
            if (nums[j] != nums[i]) {
            // 当前数据与前一个数据不同时,有效数字长度+1,同一数字出现次数为1
                length++;
                sim = 1;
            } else if (nums[j] == nums[i] && sim < 2) {
            // 当前数据与前数据相同时,同一数字出现的次数+1
            // 并且同数字出现次数小于2时有效数字长度+1
                sim++;
                length++;
            } else {
            // 当前数据与前数据相同且同一数字出现的次数≥2时,sim+1
                sim++;
            }
            // 一轮循环结束,将有效的数值赋值给下标为有效数字长度的数据
            nums[length] = nums[j];
            // i自增,新一轮比较
            i++;
        }
        return length + 1;
}

 


个人拙见,有更好的方法欢迎指教。


你可能感兴趣的:(算法,leetcode,数组)