题目
26. Remove Duplicates from Sorted Array
解题思路
我的思路是,遍历遇到重复的数字就设为-1000000(一个不会出现在数组里的数字),第一个-1000000与其后面第一个不重复的数字进行交换位置,最后-1000000都会排列在数组尾部。
我的思路其实有很大的缺陷,非要特定搞一个“不会出现在数组里的数字”,后来又是去看了discuss……还是dalao的代码高效=-=
11.4更新:
回头看一下这道题和之前去零的那道题完全是一样的。
具体代码
class Solution {
public:
void swap(vector<int>& nums, int a, int b) {
int tmp = nums[a];
nums[a] = nums[b];
nums[b] = tmp;
}
int removeDuplicates(vector<int>& nums) {
if (nums.empty())
return 0;
int num = 1;
int fisrt_dupnum_index = -1000000;
int recent_num = nums[0];
for (int i = 1; i < nums.size(); i++) {
if (nums[i] > recent_num) {
recent_num = nums[i];
++num;
if (fisrt_dupnum_index != -1000000) {
swap(nums, fisrt_dupnum_index, i);
while (fisrt_dupnum_index < nums.size() && nums[fisrt_dupnum_index] != -1000000) {
++fisrt_dupnum_index;
}
if (fisrt_dupnum_index == nums.size())
fisrt_dupnum_index = -1000000;
}
}
else if (nums[i] == recent_num) {
nums[i] = -1000000;
if (fisrt_dupnum_index == -1000000)
fisrt_dupnum_index = i;
}
}
return num;
}
};
思路简单来说就是只保留下不重复的数字,其他不考虑
c++版本
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if (nums.empty()) return 0;
int num = 1;
for (int i = 1; i < nums.size(); i++) {
if (nums[i] != nums[i-1])
nums[num++] = nums[i];
}
return num;
}
};