检查vector <int>是否包含重复的绝对值

时间:2015-07-03 03:51:49

标签: c++11 vector

尝试确定向量是否包含重复项。这适用于向量中元素的绝对值。我已经用一些案例测试了我的实现,并且得到了不一致的结果。

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

赞赏对错误实施的任何见解

2 个答案:

答案 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();
}