尝试确定向量是否包含重复项。这适用于向量中元素的绝对值。我已经用一些案例测试了我的实现,并且得到了不一致的结果。
bool has_duplicate(vector<int> v) {
vector<int>::iterator it;
for (it = v.begin(); it != v.end(); ++it) {
if (v[*it] < 0)
v[*it *= -1;
if (count(v.begin(), v.end(), v[*it]) > 1)
return true;
}
return false;
}
vector<int> v1 {1, -1}; // true
vector<int> v3 {3, 4, 5, -3}; // true
vector<int> v2 {2, -2}; // false
vector<int> v4 {3, 4, -3}; // false
vector<int> v5 {-1, 1}; // false
赞赏对错误实施的任何见解
答案 0 :(得分:4)
迭代器就像一个指针,而不是索引,所以你肯定会在代码中滥用它们。它没有为我编译。看起来你正试图在向量中搜索每个其他元素,这是低效的,时间复杂度接近于O(N ^ 2)。由于您的函数只想查看是否存在重复,因此您可以在找到重复后立即停止。通过使用一组来跟踪您到目前为止所发现的内容,您的时间复杂度更接近O(N * log(N))。
bool has_duplicate(vector<int> v)
{
set<int> s;
for (auto i = v.begin(); i != v.end(); ++i) {
int ai = abs(*i);
if (s.count(ai)) return true;
s.insert(ai);
}
return false;
}
答案 1 :(得分:1)
bool hasDuplicate(std::vector<int> v)
{
std::transform(v.begin(), v.end(), v.begin(), ::abs);
std::sort(v.begin(), v.end());
return std::adjacent_find(v.begin(), v.end()) != v.end();
}