|
2 | 2 | import java.util.Arrays; |
3 | 3 | import java.util.List; |
4 | 4 |
|
5 | | -/** |
6 | | - * ๋ฌธ์ ํ์ด |
7 | | - */ |
8 | | -// -4 -1 -1 0 2 2 |
9 | | -// p1 p2 p3 sum < 0 -> p2 ์์ผ๋ก |
10 | | -// p1 p2 p3 sum < 0 -> p2 ์์ผ๋ก |
11 | | -// p1 p2 p3 sum < 0 -> p2 ์์ผ๋ก |
12 | | -// p1 p2p3 sum = 0 -> p1 ์์ผ๋ก |
13 | | -// p1 p2 p3 sum = 0 -> p3 ๊ฐ ๋ค๋ฅธ ๊ฒ ๋์ฌ ๋๊น์ง ์ด๋ |
14 | | -// p1 p2 p3 sum < 0 -> p2 ์์ผ๋ก ์ธ๋ฐ, p2 > p3 ๋๋ฏ๋ก p1 ์์ผ๋ก |
15 | | -// p1 p2 p3 sum = 0 ๋ฐ๋ณต |
16 | | - |
17 | | -/** |
18 | | - * ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ |
19 | | - */ |
20 | | -// ์๊ฐ ๋ณต์ก๋ - ์ํ ํ์: n + (n-1) + (n-2) + .. => O(N^2) |
21 | | -// ๊ณต๊ฐ ๋ณต์ก๋ - ๋ฐฐ์ด์ ์ ๋ ฌํ๋ ๋ฐ O(n log n)์ ๊ณต๊ฐ + ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ answer ๋ฆฌ์คํธ๋ ๋ฌธ์ ์ ์๊ตฌ์ ๋ฐ๋ผ O(k)์ ๊ณต๊ฐ = O(n log n) (๋ฐฐ์ด ์ ๋ ฌ์ ์ํ ๊ณต๊ฐ) + O(k) (๊ฒฐ๊ณผ ์ ์ฅ ๊ณต๊ฐ) |
22 | | - |
23 | | -class Solution { |
24 | | - public List<List<Integer>> threeSum(int[] nums) { |
25 | | - Arrays.sort(nums); // Sort the array first |
26 | | - List<List<Integer>> answer = new ArrayList<>(); |
27 | | - |
28 | | - for (int pointer1 = 0; pointer1 < nums.length - 2; pointer1++) { |
29 | | - // pointer1 ์ ์ค๋ณต ๊ฐ skip |
30 | | - if (pointer1 > 0 && nums[pointer1] == nums[pointer1 - 1]) { |
31 | | - continue; |
32 | | - } |
33 | | - |
34 | | - int pointer2 = pointer1 + 1; // pointer2 ๋ pointer1 ์ ํ ์นธ ์ |
35 | | - int pointer3 = nums.length - 1; // pointer3 ๋ ๋์์ ๋ถํฐ |
36 | | - |
37 | | - while (pointer2 < pointer3) { |
38 | | - int sum = nums[pointer1] + nums[pointer2] + nums[pointer3]; |
39 | | - |
40 | | - if (sum < 0) { |
41 | | - pointer2++; |
42 | | - } else if (sum > 0) { |
43 | | - pointer3--; |
| 5 | +// ์๊ฐ ๋ณต์ก๋: O(n^2) - nums ๋ฐฐ์ด์ ์ ๋ ฌํ๋ ๋ฐ O(nlogn) ์์, ์ดํ ์ด์ค ํฌ์ธํฐ๋ก O(n^2) |
| 6 | +// ๊ณต๊ฐ ๋ณต์ก๋: O(1) - ๊ฒฐ๊ณผ ๋ฆฌ์คํธ๋ฅผ ์ ์ธํ ์ถ๊ฐ ๊ณต๊ฐ ์ฌ์ฉ ์์ |
| 7 | +class Solution{ |
| 8 | + public List<List<Integer>> threeSum(int[] nums){ |
| 9 | + Arrays.sort(nums); |
| 10 | + |
| 11 | + List<List<Integer>> result = new ArrayList<>(); |
| 12 | + |
| 13 | + for(int i=0;i<nums.length-2;i++){ |
| 14 | + if(i>0 && nums[i] == nums[i-1]) continue; // ์ค๋ณต๋ ๊ฐ ๊ฑด๋๋ฐ๊ธฐ |
| 15 | + int left = i+1; |
| 16 | + int right = nums.length-1; |
| 17 | + |
| 18 | + while(left < right){ |
| 19 | + int sum = nums[i] + nums[left] + nums[right]; |
| 20 | + if(sum == 0){ |
| 21 | + result.add(Arrays.asList(nums[i], nums[left], nums[right])); |
| 22 | + while(left < right && nums[left] == nums[left+1]) left++; // ์ค๋ณต๋ ๊ฐ ๊ฑด๋๋ฐ๊ธฐ |
| 23 | + while(left < right && nums[right] == nums[right-1]) right--; // ์ค๋ณต๋ ๊ฐ ๊ฑด๋๋ฐ๊ธฐ |
| 24 | + left++; |
| 25 | + right--; |
| 26 | + } else if(sum < 0){ |
| 27 | + left++; |
44 | 28 | } else { |
45 | | - // sum == 0 |
46 | | - answer.add(Arrays.asList(nums[pointer1], nums[pointer2], nums[pointer3])); |
47 | | - |
48 | | - // pointer2 ์ค๋ณต ๊ฐ ์ ๊ฑฐ |
49 | | - while (pointer2 < pointer3 && nums[pointer2] == nums[pointer2 + 1]) { |
50 | | - pointer2++; |
51 | | - } |
52 | | - |
53 | | - // pointer3 ์ค๋ณต ๊ฐ ์ ๊ฑฐ |
54 | | - while (pointer2 < pointer3 && nums[pointer3] == nums[pointer3 - 1]) { |
55 | | - pointer3--; |
56 | | - } |
57 | | - |
58 | | - // ๋ ๊ฐ ๋ชจ๋ move |
59 | | - pointer2++; |
60 | | - pointer3--; |
| 29 | + right--; |
61 | 30 | } |
62 | 31 | } |
63 | 32 | } |
64 | | - |
65 | | - return answer; |
| 33 | + return result; |
66 | 34 | } |
67 | 35 | } |
68 | | - |
69 | | - |
0 commit comments