Leetcode Java 3sum
업데이트:
문제
코드
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
Arrays.sort(nums);
for (int i = 0; i < nums.length - 2; i++) {
if (i == 0 || i > 0 && nums[i] != nums[i - 1]) {
int j = i + 1;
int k = nums.length - 1;
int sum = 0 - nums[i];
while (j < k) {
if (nums[j] + nums[k] == sum) {
result.add(Arrays.asList(nums[i], nums[j], nums[k]));
while (j < k && nums[j] == nums[j + 1]) {
j++;
}
while (j < k && nums[k - 1] == nums[k]) {
k--;
}
j++;
k--;
} else if (nums[j] + nums[k] < sum) {
j++;
} else {
k--;
}
}
}
}
return result;
}
}
결과
설명
-
주어진 정수 배열 nums를 오름차순 정렬한다.
- 반복문을 통해서 주어진 정수들의 합이 0이 되는 세 숫자를 탐색한다.
- 첫 숫자 이후 두 숫자를 더 찾아야 하므로 $nums.length - 2$까지 반복을 수행한다.
- i가 0인 경우와 i가 0초과이면서 nums[i - 1]의 값과 nums[i]의 값이 같지 않은 경우(중복되지 않은 경우)를 대상으로 탐색한다.
-
남은 두 숫자를 탐색하기 위해 $i + 1$ 부터 다음 숫자를 탐색할 변수 j와 $nums.length - 1$부터 이전 숫자를 탐색할 변수 k를 선언하고, 세 숫자의 합을 저장할 변수 sum은 -nums[i]값으로 초기화 한다.
- 변수 j의 값이 변수 k의 값과 크거나 같기 전까지 반복을 하여 나머지 두 숫자를 탐색한다.
- nums[j] + nums[k]의 값이 sum과 동일하면 result 변수에 nums[i], nums[j], nums[k] 세 값을 List로 넣어주고, j와 k의 위치를 이동한다.
- 변수 j는 변수 k의 값보다 작고, nums[j]의 값과 nums[j + 1]의 값이 같지 않을 때까지 값을 더해준다.
- 변수 k는 변수 j보다 크거나 같고, nums[k - 1]의 값과 nums[k]의 값이 같지 않을 때까지 값을 빼준다.
- nums[j] + nums[k]의 값이 sum보다 작으면 변수 j의 값을 더해준다.
- 그 외의 경우는 변수 k의 값을 빼준다.
- nums[j] + nums[k]의 값이 sum과 동일하면 result 변수에 nums[i], nums[j], nums[k] 세 값을 List로 넣어주고, j와 k의 위치를 이동한다.
- 반복이 완료되면 result 변수를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기