Given a sorted array nums, remove the duplicates in-place such that each element appear only once and return the new length.
Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.
难度【easy】
例如:
nums = [0,0,1,1,1,2,2,3,3,4],结果返回5,nums数组的前5个元素是[0,1,2,3,4].
这道题非常简单,最直接的方法就是记录两个位置(下标),
一个位置(下标) 记录当前需要比较的数值的位置。
另一个位置(下标) 记录当前第一个需要删除的元素位置。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if (nums.size() == 0) {
return 0;
}
int cur_num_idx = 0; // 记录当前需要比较的数值的位置
int cur_remove_idx = 1; // 记录当前第一个需要删除的元素位置
for (int i = 1; i < nums.size(); ++i) {
if (nums[cur_num_idx] != nums[i]) {
nums[cur_remove_idx] = nums[i];
cur_num_idx = cur_remove_idx;
++cur_remove_idx;
}
}
return cur_remove_idx;
}
};
在看solution时发现了一种更加简单的写法,思路是一样的。
下面是对上面代码的简化:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if (nums.size() == 0) {
return 0;
}
int i = 0;
for (int j = 1; j < nums.size(); ++j) {
if (nums[j] != nums[i]) {
++i;
nums[i] = nums[j];
}
}
return ++i;
}
};
在leetcode中运行情况
方法 | Runtime | Memory |
第一种写法 | 24 ms | 9.9 MB |
第二种写法 | 24 ms | 9.8 MB |