【发布时间】:2013-05-21 09:02:19
【问题描述】:
在O(n) 时间复杂度中给了我一个要解决的问题:
“给定一个数字列表和数字 x。查找列表中是否有 2 个数字加起来为 x?”
这是我的解决方案:
public class SumMatchResult {
public static void main(String[] args){
int[] numberList = {6,1,8,7,4,6};
int requiredSum = 8;
boolean isSumPresent = checkSumPresentHash(numberList,requiredSum);
if(isSumPresent) {
System.out.println("Numbers exist");
}else {
System.out.println("Numbers donot exist");
}
}
private static boolean checkSumPresentHash(int[] numberList, int requiredSum) {
Map<Integer, Integer> m = new HashMap<Integer,Integer>();
int count = 0;
for(int i=0;i<numberList.length;i++){
m.put(i, numberList[i]);
}
for(int i=0;i<numberList.length;i++){
if(m.containsValue(requiredSum - numberList[i])){
count++;
}
}
if(count>1){
return true;
}
return false;
}
}
我使用HashMap.containsValue() 而不是使用HashSet.contains(),它肯定具有O(1) 的复杂性,因为我必须考虑我的输入可能包含相同值的情况。例如,在上述情况下,我可以有一组输入值{3,6,4,4,7} 与sum 8 匹配,它应该返回true。
我上述解决方案的时间复杂度取决于HashMap.containsValue() 方法的复杂度。请阐明containsValue() 方法的时间复杂度,并建议我在时间复杂度方面是否有上述问题的更好解决方案。谢谢。
【问题讨论】:
-
也许你应该使用
Set而不是Map。 -
我很想知道有一种算法可以在 O(n) 时间内解决这个问题。我不确定这是否可能。
-
保持一个单独的
HashMap与第一个值作为他的键怎么样?这样您就可以立即知道 (O(1)) 是否存在值。这是O(2n)空间,但嘿,这很值得。 -
@JBNizet 我上次看到它已经有很长时间了,但这闻起来像是背包问题的(非常)简化版本。动态编程在这里应该有所帮助。
-
@Bohemian 不,它是关于
containsValue(),这是复杂性的根本区别。
标签: java performance optimization hashmap