【问题标题】:Find Values in an unsorted array在未排序的数组中查找值
【发布时间】:2011-12-08 13:14:35
【问题描述】:

我需要找出数组中任意两个数字之和的所有组合。如果相等,则打印它们。 该问题的线性解决方案具有 O(N^2) 复杂度。 我想到了排序,然后进行二进制比较。复杂度仍然是(NlogN + N)

问题是我需要找到它的所有组合。

这个问题的线性解决方案 例如。

//Linear search, find all the combinations
Find(int a[], int Target)
    {
       for(i=0; i<arr_size; i++)
            for(j=0; j<arr_size; j++)
                if((a[i]+a[j]) == Target)
                     cout<<a[i]<<a[j]
     }

有没有办法进一步降低复杂度?

谢谢, 大师

【问题讨论】:

  • "复杂度仍然是 (NlogN + N)" - O(NlogN) 的复杂度有什么问题??
  • 线性解应该有if(i!=j &amp;&amp; (a[i]+a[j]) == Target)。考虑到排序本身的复杂性,我不清楚排序有什么帮助?

标签: arrays binary-search


【解决方案1】:

你可以先过滤掉所有的不可能性。这应该只需要对数组进行两次迭代,并且有可能显着减少集合。如果没有,那么您只丢失了 2 次迭代。

对于初学者,您可以找到您的最小数字,然后过滤掉所有值 >(目标 - 最小数字)。

【讨论】:

    【解决方案2】:

    性能略有提升

    private static void find(int[] a, int target) {
    
        for (int i = 0; i < a.length; i++) {
            if (a[i] == target) {
                System.out.println("result found");
                break;
            }
            if (a[i] > target) {
                break;
            }
            for (int j = 0; j < a.length; j++) {
                if ((i != j && (a[i] + a[j]) == target)) {
                    System.out.println("result found");
                }
            }
        }
    }
    

    【讨论】:

    • 你假设集合的所有元素都是非负的吗?
    • 是的,假设数组包含正值。
    • 考虑到负数,你必须使用我上面的算法。无论如何,这是相同的想法。
    猜你喜欢
    • 1970-01-01
    • 2021-09-28
    • 2017-02-08
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多