LeetCode - Two Sum II - 입력 배열이 정렬됨
11231 단어 gojavascriptalgorithmsprogramming
문제 설명
이미 내림차순으로 정렬된 정수 숫자의 1-인덱스 배열이 주어지면 특정 대상 숫자가 되는 두 숫자를 찾습니다. 이 두 숫자를 numbers[index1] 및 numbers[index2]라고 합니다. 여기서 1 <= index1 < index2 <= numbers.length입니다.
두 숫자 index1과 index2의 인덱스를 하나씩 더한 길이 2의 정수 배열 [index1, index2]로 반환합니다.
정확히 하나의 솔루션이 있도록 테스트가 생성됩니다. 동일한 요소를 두 번 사용할 수 없습니다.
솔루션은 일정한 추가 공간만 사용해야 합니다.
문제 진술 출처: https://leetcode.com/problems/two-sum-ii-input-array-is-sorted
예 1:
Input: numbers = [2, 7, 11, 15], target = 9
Output: [1, 2]
Explanation: The sum of 2 and 7 is 9. Therefore, index1 = 1, index2 = 2. We return [1, 2].
예 2:
Input: numbers = [2, 3, 4], target = 6
Output: [1, 3]
Explanation: The sum of 2 and 4 is 6. Therefore, index1 = 1, index2 = 3. We return [1, 3].
예 3:
Input: numbers = [-1, 0], target = -1
Output: [1, 2]
Explanation: The sum of -1 and 0 is -1. Therefore index1 = 1, index2 = 2. We return [1, 2].
제약:
- 2 <= numbers.length <= 3 * 10^4
- -1000 <= numbers[i] <= 1000
- numbers are sorted in non-decreasing order.
- -1000 <= target <= 1000
- The tests are generated such that there is exactly one solution.
설명
이진 검색
이 문제는 이전Two Sum 문제와 유사합니다. 숫자를 반환하는 대신 합계가 목표인 인덱스를 반환해야 합니다.
입력 배열이 정렬되어 이진 검색 개념을 쉽고 직접적으로 사용할 수 있습니다. 알고리즘을 직접 확인해 봅시다.
- initialize i = 0, j = numbers.size() - 1
sum = 0
- loop while i < j
- sum = numbers[i] + numbers[j]
- if sum > target
- decrement: j--
- else if sum < target
- increment: i++
- else
// when the sum is equal to the target
- return [i + 1, j + 1]
- while end
- return []
C++, Golang, Javascript에서 알고리즘을 확인해 봅시다.
C++ 솔루션
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int i = 0, j = numbers.size() - 1;
int sum;
while(i < j) {
sum = numbers[i] + numbers[j];
if(sum > target) {
j--;
} else if(sum < target) {
i++;
} else {
return { i + 1, j + 1 };
}
}
return {};
}
};
골랑 솔루션
func twoSum(numbers []int, target int) []int {
i, j := 0, len(numbers) - 1
sum := 0
for i < j {
sum = numbers[i] + numbers[j]
if sum > target {
j--
} else if sum < target {
i++
} else {
return []int{ i + 1, j + 1 }
}
}
return []int{}
}
자바스크립트 솔루션
var twoSum = function(numbers, target) {
let i = 0, j = numbers.length - 1;
let sum = 0;
while(i < j) {
sum = numbers[i] + numbers[j];
if(sum > target) {
j--;
} else if(sum < target) {
i++;
} else {
return [i + 1, j + 1];
}
}
return [];
};
예제 1의 알고리즘을 시험 실행해 보겠습니다.
Input: numbers = [2, 7, 11, 15]
target = 9
Step 1: set i = 0
j = numbers.size() - 1
= 4 - 1
= 3
sum = 0
Step 2: loop while i < j
0 < 3
true
sum = numbers[i] + numbers[j]
= numbers[0] + numbers[3]
= 2 + 15
= 17
if sum > target
17 > 9
true
j--
j = j - 1
= 3 - 1
= 2
Step 3: loop while i < j
0 < 2
true
sum = numbers[i] + numbers[j]
= numbers[0] + numbers[3]
= 2 + 11
= 13
if sum > target
13 > 9
true
j--
j = j - 1
= 2 - 1
= 1
Step 4: loop while i < j
0 < 1
true
sum = numbers[i] + numbers[j]
= numbers[0] + numbers[3]
= 2 + 7
= 9
if sum > target
9 > 9
false
else if sum < target
9 < 9
false
else
return [i + 1, j + 1]
return [0 + 1, 1 + 1]
return [1, 2]
We return the answer as [1, 2].
Reference
이 문제에 관하여(LeetCode - Two Sum II - 입력 배열이 정렬됨), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/_alkesh26/leetcode-two-sum-ii-input-array-is-sorted-2pg0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)