给你一个 升序排列 的数组 nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums
中唯一元素的个数。
考虑 nums
的唯一元素的数量为 k
,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums
,使nums
的前k
个元素包含唯一元素,并按照它们最初在nums
中出现的顺序排列。nums
的其余元素与nums
的大小不重要。 - 返回
k
。
示例 1:
输入:nums = [1,1,2] 输出:2, nums = [1,2,_] 不需要考虑数组中超出新长度后面的元素。
示例 2:
输入:nums = [0,0,1,1,1,2,2,3,3,4] 输出:5, nums = [0,1,2,3,4] 不需要考虑数组中超出新长度后面的元素。
提示:
1 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums
已按 升序 排列
1.暴力双for循环,代码如下:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int len = nums.size();
int k = 1, t = nums[0];//第一个元素是无论如何都不要动的,所以拿出来单独分析,不相同元素个数也设置为1
for(int i = 1; i < len; i++)
{
//从i开始遍历数组,因为数组是升序排列的。
for(int j = i ; j < len; j++)
{
//数组元素比前面已排列的元素的最后一个元素大
if(nums[j] > t){
nums[i] = nums[j];//将该元素添加到已排列元素的最后
t = nums[j];//更新比较值,即最后一个已派列元素的值
i++;//i始终代表已派列数组元素的最后一位加1,给新来的元素预留位置
k++;//已排列数组元素个数+1
}
}
}
return k;
}
};
/*作者:CaiCode
链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/solutions/2386238/yong-liang-ge-forxun-huan-gai-dong-shu-z-yf26/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/
2.双指针1,代码如下:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int len = nums.size();
int l = 1, r = 1;//将快慢指针指向下标1,第一个元素无论如何不需要动
while(l <= r && r < len)//遍历数组
{
if(nums[r] != nums[r - 1])//因为数组是有序数组,相等的元素一定是排列在一起的,即下标连续,故可以判断当前元素和上一元素的等价关系
{
nums[l++] = nums[r];//若不等于,即说明快指针找到了下一个不同元素的位置,将其归并到已排列元素(即不同元素的组合)当中,称为不同元素组合当中的最后一位,并将慢指针加1,给下一个不同元素预留位置。
}
r++;//无论如何快指针在每次循环后都往后推一位,因为它只是负责查找的功能。
}
return l;//因为l最后代表的是不同元素组合的最后一位元素的下标加1,表明不同元素的最后一位下标为l-1,而数组是从0开始计数的,所以最后不同元素共有(l-1)+ 1 = l 个。
}
};
/*
作者:CaiCode
链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/solutions/2386280/shuang-zhi-zhen-by-caicodehh-3n0s/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/
双指针判断当前元素与上一元素的等价关系
3.双指针2,代码如下:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int len = nums.size();
if(len == 0) return 0;//一个元素都没有的情况,空数组返回0
int l = 0, r = 0,k = 1;//双指针快慢指针均指向0,元素个数设置为1
while(l <= r && r < len - 1){
//快指针找到下一个元素不一样了
if(nums[r] != nums[r + 1]){
//快慢指针相等的情况,这时候无需排列,跳过做下次循环即可
if(l == r){
l++;
r++;
k++;
continue;
}
l++;//慢指针加1,给新元素留位置
nums[l] = nums[r + 1];//替换元素值
k++;//不相同的元素加1
}
r++;//无论如何,慢指针每次循环后必定加1去找
}
return k;
}
};
/*
作者:CaiCode
链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/solutions/2386254/shuang-zhi-zhen-jie-jue-by-caicodehh-cmdm/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/
双指针判断当前元素与下一元素是否相等