https://www.youtube.com/watch?v=cxhbgAbAiXI&list=PLcXyemr8ZeoTVBFTEB673TC8Ba4UBSTRz&index=6
리스트에 있는 서로 다른 두 정수의 합이 target number와 같다면 true를 반환하는 함수를 구현하시오.
리스트에 있는 서로 다른 두 정수의 합이 target number와 같다면 true를 반환하는 함수를 구현하시오.
입력값
num = {1, 2, 15, 6} target Number = 7
num = {1, 2, 15, 6} target Number = 7 public static boolean twoSum(){ for(int i=0;i<nums.length;i++){ for(int j=0;j<nums.length;j++){ if( i == j ) continue; int sum = nums[i] + nums[j]; if( sum == target ) return True; } } return false; }
시간복잡도는 O(N^2) 이다.
위의 코드를 개선해보자.
num = {1, 2, 15, 6} target Number = 7 public static boolean twoSum(){ for(int i=0;i<nums.length;i++){ for(int j=i + 1;j<nums.length;j++){ int sum = nums[i] + nums[j]; if( sum == target ) return True; } } return false; }
개선은 되었지만, 시간복잡도는 O(N^2) 이다.
성능자체는 개선되었다.
HashSet을 활용한다면 훨씬 빨라질것이다.
num = {1, 2, 15, 6} target Number = 7 public static boolean twoSum(){ for(int i=0;i<nums.length;i++){ hashset.add(nums[i]); } for(int i=0;i<nums.length;i++){ if( hashset.contains( targetNumber - nums[i] ) == true ){ return true; } } return false; }
시간복잡도는 O(N) 이다.
HashSet 사용시 시간복잡도 조회는 O(1)이다.
문제가 있다. 코드에는 버그가 잇다.
만약 target Numbers = 4 이다.
1 2 15 6 .. 에서 만약
만약 2 를 선택했을경우 똑같은 2 가 두번 계산되서 오류가 난다. 문제의 조건은 서로 다른 두 정수인것이다.
num = {1, 2, 15, 6} target Number = 4 public static boolean twoSum(){ Hashset hashset = new HashSet<>(); for(int i=0;i<nums.length;i++){ if( hashset.contains( targetNumber - nums[i] ) == true ){ return true; } else{ hashset.add(numbs[i]); } } return false; }
이를 통해 중복된 값을 연산하지 않고, 이전까지의 숫자 값에서 targetNumber와 같은 값을 알아낼 수 있다.
시간복잡도는, Set만드는작업은 O(1), for문은 N번 반복되고 바디부분에서의 시간복잡도는 O(1)이다.
즉, O(1) + N * O(1) 이므로 O(N) 이다.