【发布时间】:2014-01-12 18:09:44
【问题描述】:
当我被要求编写一个方法来检查数组列表中的任何对是否等于给定值时,我想出了这个:
import java.util.ArrayList;
public class FindWhetherTwoInArrEqual {
public static void main(String[] args) {
ArrayList<Integer> arr = new ArrayList<Integer>();
arr.add(10); arr.add(12);
arr.add(18); arr.add(10);
arr.add(8); arr.add(12);
arr.add(33); arr.add(28);
arr.add(2); arr.add(20);
findWhetherTwoInArraySumToValue(arr, 30);
}
public static boolean findWhetherTwoInArraySumToValue(ArrayList<Integer> array, int value)
{
for(int i = 0; i < array.size(); ++i)
for(int j=i+1; j < array.size(); ++j)
if(array.get(i) + array.get(j) == value)
System.out.println(array.get(i) +" + "+ array.get(j) + " = " + value);
return false;
}
}
结果:
10 + 20 = 30
12 + 18 = 30
18 + 12 = 30
10 + 20 = 30
28 + 2 = 30
时间复杂度为 O(n)。
有没有更有效的方法?
【问题讨论】:
-
你的意思是任何一对的总和?
-
这不是算法,而是实现注释:我会将
array.get(i)和array.get(j)缓存到变量中。 JIT 可能可以为您做到这一点,但您知道您可以做到,所以... 如果您的范围正确,您甚至可以将它们设为final作为对 JIT 的附加提示。示例:pastie.org/8626976 -
项目 HASHCODE 怎么样?
-
这不是线性时间,而是二次时间。使用哈希集,您可以轻松获得线性。