[Leetcode]15. 3Sum(x)
2024. 7. 30. 23:06ㆍjava/javaAlgorithm
1. problem :
https://leetcode.com/problems/3sum/description/
2. solution 1 :
public class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> ans = new ArrayList<>();
for (int i = 0; i < nums.length - 2; i++) {
if (i > 0 && nums[i - 1] == nums[i]) {
continue;
}
int left = i + 1;
int right = nums.length - 1;
while (left < right) {
int sum = nums[i] + nums[left] + nums[right];
if (sum == 0) {
ans.add(Arrays.asList(nums[i], nums[left], nums[right]));
while (left < right && nums[left] == nums[left + 1]) left++;
while (left < right && nums[right] == nums[right - 1]) right--;
left++;
right--;
} else if (sum < 0) {
left++;
} else {
right--;
}
}
}
return ans;
}
이 문제는 chat gpt 4o한테 받은 solution이다. 크게 보면, i값을 설정하고 , left와 right를 설정한다. left는 i의 바로뒤쪽, right는 nums 끝쪽이다. 이제 하나씩 좁혀오며 검사를 하는 방식이다. 이때, 중복된 값을 피하는 logic이 2개 있다. 첫 번째는 , for문 바로 밑에 있는 if절이다. 여기서는 nums [i] == nums [i-1] 값이 같다면 굳이 i는 안 해도 된다는 논리다.
그리고 또 다른 중복 피하는 logic은 if sum == 0일 때를 보면 , while문 두 개가 있다. 여기서는 nums [left] == nums [left + 1]이 같다면 굳이 left +1은 안 해봐도 된다는 논리다. right도 마찬가지.
이문제의 핵심은 nums를 정렬해 주는 거다. 정렬을 함으로 인해서 two - pointer가 간단한 logic에 의해 자유롭게 움직일 수 있게 되었다.
'java > javaAlgorithm' 카테고리의 다른 글
[Leetcode]1004. Max Consecutive Ones III(x) (0) | 2024.07.31 |
---|---|
[Leetcode]49. Group Anagrams(x) (0) | 2024.07.31 |
[Leetcode]1. Two Sum (0) | 2024.07.30 |
[Leetcode]242. Valid Anagram (0) | 2024.07.30 |
[Leetcode]217. Contains Duplicate (0) | 2024.07.30 |