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()
肯定具有复杂性的 a,O(1)
因为我必须考虑我的输入可能包含相同值的情况。例如,在上述情况下,我可以有一组输入值{3,6,4,4,7}
来匹配sum 8
,它应该返回true
。
我上述解决方案的时间复杂度取决于HashMap.containsValue()
方法的复杂度。请阐明containsValue()
方法的时间复杂度,并建议我在时间复杂度方面是否有上述问题的更好解决方案。谢谢你。