class Solution {
public:
int removeDuplicates(vector<int>& nums) {
//use set. As in set, element appears only once.
set<int> s;
for(int i=0; i<nums.size(); i++) {
s.insert(nums[i]);
}
nums.clear();
for(int i=0; i<s.size(); i++) {
nums.push_back(s[i]);
}
return s.size();
}
};
Run Code Online (Sandbox Code Playgroud)
https://leetcode.com/problems/remove-duplicates-from-sorted-array/solutions/
正如你所看到的,上面是我针对 leetcode 问题的解决方案代码(我还在下面给出了它的链接)。我似乎没有在我的代码中看到问题,但它给了我错误。请帮忙。
编译器是正确的。Astd::set没有下标运算符。一般来说,带有 an 的容器operator[]使用它来提供元素的恒定时间查找。在数组 中int arr[10],您可以使用arr[9]并访问第 10 个元素,其速度与访问第一个元素 一样快arr[0]。这对于std::unordered_map和 来说是类似的std::map。您有一个键,您可以使用它在大约相同的时间内查找值,而与您查找哪个元素无关。
std::set然而不是这样的容器。10访问a 中的元素std::set需要一直迭代到第 10 个元素。幸运的是,您不需要下标运算符。只需使用 中的迭代器创建集合vector,然后将结果分配回向量:
class Solution {
public:
std::size_t removeDuplicates(std::vector<int>& nums) {
// create the set from the values in the vector:
std::set<int> s(nums.begin(), nums.end());
// assign the values in the set to the vector:
nums.assign(s.begin(), s.end());
return s.size();
}
};
Run Code Online (Sandbox Code Playgroud)
然而,阅读实际任务会发现一些有趣的事情:
nums给定一个按非降序排序的整数数组,就地删除重复项,以便每个唯一元素仅出现一次。元素的相对顺序应保持相同。
它已经排序的事实使得人们很容易使用std::unique并vector::erase就地执行此操作,而不是使用std::set:
#include <algorithm>
class Solution {
public:
std::size_t removeDuplicates(std::vector<int>& nums) {
auto new_end_it = std::unique(nums.begin(), nums.end());
nums.erase(new_end_it, nums.end());
return nums.size();
}
};
Run Code Online (Sandbox Code Playgroud)