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;
}
}
if (nums[N - 1] != nums[N - 2])
v.push_back(1);
else
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;
}
};