|
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