饭不食,水不饮,题必须刷
C语言免费动漫教程,和我一起打卡! 《光天化日学C语言》
LeetCode 太难?先看简单题! 《C语言入门100例》
数据结构难?不存在的! 《数据结构入门》
LeetCode 太简单?算法学起来! 《夜深人静写算法》
给出一个有序数组 n u m s nums nums ,请 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间。
样例输入: n u m s = [ 0 , 0 , 1 , 1 , 1 , 2 , 2 , 3 , 3 , 4 ] nums = [0,0,1,1,1,2,2,3,3,4] nums=[0,0,1,1,1,2,2,3,3,4]
样例输出: 5 , n u m s = [ 0 , 1 , 2 , 3 , 4 ] 5, nums = [0,1,2,3,4] 5,nums=[0,1,2,3,4]。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
}
};
vector
类型的引用,要求在这个数组基础上进行修改,不能引入其它数组。LeetCode 26. 删除有序数组中的重复项
由于数组是有序的,所以大小相等的数一定出现在连续的一段区间。所以,核心是比较,如果相等则舍弃,不相等就放入候选数组。由于我们做的是删除操作,所以候选数组的长度在任何时候一定小于原数组,所以候选数组可以和原数组是同一块内存空间。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int nowIdx = 0; // (1)
if(nums.size() == 0) {
return 0;
}
for(int i = 1; i < nums.size(); ++i) { // (2)
if(nums[i] != nums[nowIdx]) {
nums[++nowIdx] = nums[i];
}
}
return nowIdx + 1; // (3)
}
};
nowIdx
记录的是 有序不重复数组 最后一个元素的下标;当数组有序时,相等的元素一定出现在连续的一段区间内。