1. 문제 분석
문제분석
--------------------
오름차순 정렬된 1-index 정수 배열이 주어지면
특정 목표 숫자(target)에 합산되는 2개의 숫자를 [index1, index2] 반환하라.
O(1)의 공간복잡도를 사용하여 풀어라.
target = numbers[index1] + numbers[index2]
1 <= index1 < index2 <= numbers.length
제한조건
--------------------
- 2 <= numbers.length <= 3 * 10^4
- -1000 <= numbers[i] <= 1000
- numbers는 오름차순 정렬됨
- -1000 <= target <= 1000
- 테스트는 정확히 1개의 해결책이 있도록 생성된다.
2. 접근 방법
접근방법 - Two pointer
--------------------
1. index1을 시작, index2를 끝 인덱스에서 시작한다.
2. index1 < index2를 만족하면 반복한다.
- sum이 target 보다 작으면, index1을 오른쪽으로 이동시킨다.
- sum이 target 보다 크면, index2를 왼쪽으로 이동시킨다.
- sum이 target이랑 같으면 [index1, index2]를 반환한다.
3. 코드
var twoSum = function(numbers, target) {
let index1 = 0;
let index2 = numbers.length - 1;
while (index1 < index2) {
let sum = numbers[index2] + numbers[index1]
if (sum < target) {
index1++;
} else if (sum > target) {
index2--;
} else {
return [index1 + 1, index2 + 1]
}
}
};
4. 복잡도 분석
- 시간복잡도: O(n)
- 공간복잡도: O(1)
Two pointer를 활용했는데, 처음엔 index1, index2를 시작 지점에 두고 하니 효율성이 떨어지고 엣지케이스들이 발생하였다.
가령, numbers = [-1,-1,-1,-1, ..., -1, 1, 1] , target = 2 일 경우 index1, index2를 왼쪽에서 부터 시작 하게되면
불필요한 연산을 많이 하여 시간 초과 에러가 발생한다.
Two pointer를 양쪽에서 시작하도록 초기화하여 이를 개선하였다.
'Leetcode' 카테고리의 다른 글
[Leetcode] 15. 3Sum - JS (1) | 2024.10.04 |
---|---|
[Leetcode] 11. Container With Most Water - JS (0) | 2024.10.03 |
[Leetcode] 392. Is Subsequence - JS (0) | 2024.10.01 |
[Leetcode] 125. Valid Palindrome - JS (0) | 2024.09.30 |
[Leetcode] 28. Find the Index of the First Occurrence in a String - JS (2) | 2024.09.29 |