[Leetcode]15. 3Sum(x)

2024. 7. 30. 23:06java/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