Problem
Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i != j, i != k, and j != k, and nums[i] + nums[j] + nums[k] == 0.
Notice that the solution set must not contain duplicate triplets.
Example 1:
Input: nums = [-1,0,1,2,-1,-4]
Output: [[-1,-1,2],[-1,0,1]]
Explanation:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0.
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0.
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0.
The distinct triplets are [-1,0,1] and [-1,-1,2].
Notice that the order of the output and the order of the triplets does not matter.
Example 2:
Input: nums = [0,1,1]
Output: []
Explanation: The only possible triplet does not sum up to 0.
Example 3:
Input: nums = [0,0,0]
Output: [[0,0,0]]
Explanation: The only possible triplet sums up to 0.
Constraints:
- 3 <= nums.length <= 3000
- -105 <= nums[i] <= 105
Solution
3개의 항의 합이 0이 되는 경우를 반환하는 문제이다.
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
HashSet<List<Integer>> result = new HashSet<>();
Arrays.sort(nums);
for (int i = 0; i < nums.length - 2; i++){
int j = i + 1;
int k = nums. length - 1;
while(j < k){
int sum = nums[i] + nums[j] + nums[k];
if(sum == 0){
result.add(Arrays.asList(nums[i], nums[j++], nums[k--]));
}
else if(sum < 0){
j++;
}
else if(sum > 0){
k--;
}
}
}
return new ArrayList<>(result);
}
}
1) Arras를 통하여 정렬을 한다.
2) 낮은 순으로 정렬이 되어있으니 합이 0보다 클 경우는 k의 값을 줄이고 작을 경우는 j의 값을 높이면서 전체적으로 순환을 한번 해준다.
Reference
반응형
'백준 Algorithm' 카테고리의 다른 글
[프로그래머스] 문자열 나누기 Java 풀이 (0) | 2023.03.15 |
---|---|
[프로그래머스] 대충 만든 자판 Java 풀이 (2) | 2023.03.13 |
[프로그래머스] 둘만의 암호 Java 풀이 (0) | 2023.03.09 |
[LeetCode - Data Structure II] 169. Majority Element (0) | 2022.11.08 |
[LeetCode - Data Structure II] 136. Single Number (0) | 2022.11.06 |