我需要找出数组中任意两个数字之和的所有组合。如果相等则打印它们。 该问题的线性解具有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]
}
有没有办法进一步降低复杂性?
谢谢, 大师
答案 0 :(得分:0)
您可以先筛选出所有不可能性。这应该只需要在阵列中进行两次迭代,并且有可能大大减少该集合。如果没有,那么你只丢失了2次迭代。
对于初学者,您可以找到最少的数字,然后过滤掉所有值&gt; (目标 - 最少数量)。
答案 1 :(得分:0)
略微改善了性能
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");
}
}
}
}