【问题标题】:Avoiding duplications when comparing array elements比较数组元素时避免重复
【发布时间】:2015-09-09 01:10:14
【问题描述】:

问题类似于:遍历一个数组并找到加起来为某个总和 k 的元素对。

for (auto i : array) {
   for (auto j : array) {
        if (i+j==k) {
            *Do something
        }
    }
}

假设我们有array = [1,2,5]k=3; when i=1 and j=2,我们将执行做某事。但是当i=2j=1 时,我们会再次执行Do something,即使我们已经找到了2 个元素并且我们会重复答案。

本质上,如何遍历一个数组并避免多次比较相同的 2 个元素?

【问题讨论】:

  • 首先对向量进行排序...

标签: algorithm c++11 compare


【解决方案1】:

如果顺序无关紧要,那么决定你想要哪一半:i >= j 所在的那一对,i <= j 所在的那一对。

for (i=0...)
    for (j=i...)

就像 rici 评论的那样,与对向量进行排序(副本)相比,这是一个非常慢的 (O(N^2)) 算法。我想你可以从头开始迭代i,从结尾向后迭代j,比较i+j <= k来决定是修改i还是j

【讨论】:

    【解决方案2】:

    如果我没有把你的问题弄错了,那么这个解释的过程可能是解决它的一种方法。

    1. 递增顺序对数组进行排序(最好合并排序,因为它需要O(n.log(n))时间).
    2. 现在,取两个索引,分别称为 lowhigh,其中 low 是排序后最左边最小数的索引数组和高是同一排序数组的最右边最大数的索引。
    3. 现在,这样做:

      while(low < high) {
          if(arr[low] + arr[high] == k) {
              print "unique pair found"
              high = high - 1;
              low = low + 1;
          }
      
          else if(arr[low] + arr[high] > k){
              high = high - 1;    
          } 
      
          else {
              low = low + 1;
          }
      }
      
    4. 它的时间复杂度是 O(n),它肯定会给你想要的? (欢迎提出任何疑问)。

    【讨论】:

      【解决方案3】:

      您可以将i + j 的结果放入vector,然后是sort it,然后是remove duplicates,最后遍历向量并“做某事”。

      【讨论】:

      • array[i] + array[j] 的所有组合进行排序会比在array 上循环多次要慢。或者你是否故意暗示这是一个家庭作业问题,让 OP 思考至少解决问题的坏方法?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-19
      • 2022-11-27
      • 2015-07-08
      • 1970-01-01
      • 2020-07-10
      • 1970-01-01
      • 2016-03-25
      相关资源
      最近更新 更多