列表

详情


NC394. 删除升序数组的重复元素(二)

描述

给定一个长度为 n 的有序数组 nums, 请你原地删除重复出现超过三次的元素,使每个元素出现最多两次,返回删除后新数组的长度 m ,你必须原地修改nums数组才能通过本题。
系统会如下来测试你的代码:
int[] rightNums = [...]; // 长度正确的答案
int m = removenums(nums); // 调用

assert m == rightNums.length;
for (int i = 0; i < m; i++) {
    assert nums[i] == rightNums[i];
}
如果所有断言都能通过,那么你的程序会被视为正确


数据范围: ,数组中的元素满足

示例1

输入:

[1,1,2,2,3]

输出:

5
[1,1,2,2,3]

说明:

不用删除

示例2

输入:

[1,1,1,2,2,2,3,3]

输出:

6
[1,1,2,2,3,3]

说明:

删除第三个 1 和第三个 2 即可。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 28ms, 内存消耗: 3016KB, 提交时间: 2022-04-29

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @param numsLen int nums数组长度
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
int removenums(int* nums, int numsLen ) {
    // write code here
    int slow = 1;
    for(int fast = 2; fast < numsLen; fast++) {
        //若快指针位置的元素不等于慢指针的元素
        if(nums[fast] != nums[slow]|| nums[slow - 1] != nums[fast]) {
            //慢指针+1,即将快指针挪到原慢指针指向的下一位
            nums[++slow] = nums[fast];
        } 
    }
    //最后慢指针的大小+1就是新的数组的大小
    return slow+1;
}

C++ 解法, 执行用时: 31ms, 内存消耗: 3136KB, 提交时间: 2022-03-23

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int removenums(vector<int>& nums) {
        // write code here
        int n = nums.size();
        if (n <= 2) {
            return n;
        }
        int slow = 2, fast = 2;
        while (fast < n) {
            if (nums[slow - 2] != nums[fast]) {
                nums[slow] = nums[fast];
                ++slow;
            }
            ++fast;
        }
        return slow;
    }
};

C++ 解法, 执行用时: 31ms, 内存消耗: 3140KB, 提交时间: 2022-06-10

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int removenums(vector<int>& nums) {
        // write code here
        int num=1;
        int first=0,second=0;
        for(;second<nums.size();second++){
            if(second>=1&&nums[second]==nums[second-1]) num++;
            else num=1;
            if(num<3){
                nums[first++]=nums[second];
            }
          /*  if(nums[second]==nums[second-1]){
                num++;
            }else{
                if(num<3){
                    while(num){
                        nums[first++]=nums[second-num];
                        num--;
                    }
                }
                num=1;
            }*/
        }
      /* if(num<=3){
                    while(num){
                        nums[first++]=nums[second-num];
                        num--;
                    }
                }*/
        nums.resize(first);
        return nums.size();
    }
};

C++ 解法, 执行用时: 31ms, 内存消耗: 3220KB, 提交时间: 2022-05-07

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int removenums(vector<int>& nums) {//下标从零开始的数组
        // write code here
       int n= nums.size();
        if(n <=2 ) return n;
        
        int fast=2, slow=2;
        while( fast < n )
        {
            if(nums[slow-2] != nums[fast])
            {
                nums[slow]=nums[fast];
                slow++;
            }
            fast++;
        }
        return slow;
        
        
    }
};

C 解法, 执行用时: 32ms, 内存消耗: 3024KB, 提交时间: 2022-03-29

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @param numsLen int nums数组长度
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
int removenums(int* nums, int numsLen ) {
    // write code here
    int hash[100001] = {0};
    int index = 0;
    for (int i = 0; i < numsLen; i++) {
        hash[nums[i]]++;
        if (hash[nums[i]] <= 2) {
            nums[index++] = nums[i];
        }
    }
    return index;
}

上一题