Мне была задана проблема в сложности O(n)
:
"Учитывая список чисел и число x. Найдите, есть ли в списке два числа, которые содержат до 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()
и предложить мне, если есть лучшее решение для вышеупомянутой проблемы с точки зрения временной сложности. Спасибо.