26. 删除有序数组中的重复项 - 力扣(LeetCode)
我刚开始想到了count,继而想到了set的count
set
这个代码是错误代码:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
unordered_set<int> once;
for (auto ch : nums) {
if (once.count(ch)) {
ch = INT_MAX; // 将重复元素标记为INT_MAX
} else {
once.insert(ch);
}
}
int i = 0;
for (auto ch : nums) {
if (ch != INT_MAX) { // 将不是INT_MAX的元素放到数组前面
nums[i] = ch;
i++;
}
}
return i;
}
};
nums的值并没有被修改,原因:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
unordered_set<int> once;
int i = 0;
for (int j = 0; j < nums.size(); j++) {
if (once.count(nums[j]) == 0) { // 如果元素未出现过
once.insert(nums[j]); // 将元素加入set中
nums[i] = nums[j]; // 将元素放到数组前面
i++;
}
}
return i;
}
};
有了set就可以用map
map
class Solution {
public:
int singleNumber(vector<int>& nums) {
unordered_map<int,int> OnceMap;
for(auto ch:nums)
{
OnceMap[ch]++; //是将num作为key,对应的value加1。这样就可以统计每个数字出现的次数了。
}
unordered_map <int,int>::iterator it=OnceMap.begin();
int result=0;
for( ;it!=OnceMap.end();it++)
{
if(it->second==1)
{
result=it->first;
return result;
}
}
return -1;// 如果没有只出现一次的数字,则返回-1
}
};
但是用set,map并不是最优解,因为需要遍历两遍数组,没有双指针效率高
双指针
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if (nums.empty()) {
return 0;
}
int n = nums.size();
int slow = 1;
for (int fast = 1; fast < n; fast++) {
if (nums[fast] != nums[fast-1]) {
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
};