题源力扣:
题目:给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
要求:nums 的前 k 个元素应该保存最终结果;空间复杂度O(1);返回k
C语言:
解1:
//暴力解,遍历数组,有相同元素就将后面全部前移
int removeDuplicates(int* nums, int numsSize){
int n=numsSize;
for(int i=0,j=i+1;j<n;){
if(nums[i]==nums[j]){
n--;
int q=j;
//cout<<n;
for(int k=q+1;k<n+1;k++){
nums[q]=nums[k];
//cout<<nums.at(q);
q++;
}
}
else{
i++;
j++;
}
}
return n;
}
解2:
//巧解:一个指针后移至第一个不等于数组首元素值,将其赋值为数组下一个数
int removeDuplicates(int* nums, int numsSize){
//巧解,找到第一个不等于前者的值,赋给该值后的第一个数
int count=1, k=0;
for(int i=1; i<numsSize; i++){
if(nums[i]!=nums[k]){
nums[++k] = nums[i];
count++;
}
}
return count;
}
C++:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
//unique()删除重复元素,返回迭代器指向无重复元素的下一个位置
vector<int>::iterator pos=unique(nums.begin(),nums.end());
//erase()擦除无意义部分
nums.erase(pos,nums.end());
return nums.size();
}
};