删除排序数组中的重复项

0.题目描述

给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
返回 k 。

题目链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/

考虑采用两种方法进行求解:

1.双指针法:

利用两个指针分别指向前一个元素和后一个元素 若左指针指向元素值等于右指针指向元素值,则左指针不动 右指针一直++
双指针法
class Solution {
public:

    int removeDuplicates(vector<int>& nums) {
        //双指针法
        int N = nums.size();
        if (N == 1)
            return N;
        int p1 = 0, p2 = 1;
        for (; p2 < N;p2++)
        {
            if (nums[p2] != nums[p1])
                nums[++p1] = nums[p2];
        }
        return p1+1;
    }
};

2.计数排序法法:

计数排序其实就是根据元素个数提前记录好相同元素个数置于表中 然后每次index跳过为前一个元素相同元素的值
计数排序法
class Solution {
public:
    //原地删除重复元素,已升序
    //感觉可以用计数排序
    int removeDuplicates(vector<int>& nums) {
        vector<int>v;
        int N = nums.size();
        if(N==1)
            return N;
        int number = 1;
        for (int i = 1; i < N; ++i)
        {
            if (nums[i] == nums[i - 1])
                number++;
            else
            {
                v.push_back(number);
                number = 1;
            }
        }
        v.push_back(number); //避免后面几个也相同
        number = v.size();
        for (int i = 1, k = 0; i < number; ++i)
        {
            k += v[i - 1];  //其实就是记录前面有多少个元素
            nums[i] = nums[k];
        }
        return number;
    }
};
posted @ 2023-05-11 10:38  Kellen_Gram  阅读(47)  评论(0)    收藏  举报