|
1 | | -/** |
2 | | - * @param {number[]} nums |
3 | | - * @return {number[][]} |
4 | | - * |
5 | | - * 풀이 1 |
6 | | - * |
7 | | - * 이렇게 푸니까 시간복잡도 O(n^3) / 공간복잡도 O(n) 라서 복잡한 예시에는 time limit 이 발생함 |
8 | | - * 개선해보자.. |
9 | | - * |
10 | | - * function threeSum(nums: number[]): number[][] { |
11 | | - * nums.sort((a, b) => a - b); |
12 | | - * let result = [] |
13 | | - * for (let i= 0; i<nums.length; i++){ |
14 | | - * for(let j= i+1 ; j <nums.length; j++){ |
15 | | - * for (let k = j+1; k<nums.length; k++){ |
16 | | - * if(nums[i]+nums[j]+nums[k]===0){ |
17 | | - * result.push([nums[i], nums[j], nums[k]]); |
18 | | - * } |
19 | | - * } |
20 | | - * } |
21 | | - * } |
22 | | - * |
23 | | - * return Array.from( |
24 | | - * new Set(result.map(item => JSON.stringify(item))), |
25 | | - * str => JSON.parse(str) |
26 | | - * ); |
27 | | - * } |
28 | | - * |
29 | | - * 풀이 2 |
30 | | - * |
31 | | - * 투포인터를 활용해보자. |
32 | | - * 아래처럼 문제를 풀게되면 시간복잡도 O(n^2) / 공간복잡도 O(1) 이다. |
33 | | - * 시공간 복잡도가 줄긴하지만 메모리 사용량과 큰 숫자를 다룰 때 성능이 매우 좋다! |
34 | | - */ |
35 | | - |
36 | | - |
37 | | -function threeSum(nums: number[]): number[][] { |
38 | | - let result : number[][] = [] |
39 | | - nums.sort((a, b) => a - b); |
40 | | - const n = nums.length; |
41 | | - |
42 | | - for(let first = 0; first<n-2; first++){ |
43 | | - // 첫번째가 양수면 0이 될 수 없음 |
44 | | - if(nums[first] > 0) break; |
45 | | - |
46 | | - //중복된 수는 건너뜀 |
47 | | - if(first > 0 && nums[first]===nums[first-1]) continue; |
48 | | - |
49 | | - let left = first + 1; |
50 | | - let right = n-1; |
51 | | - |
52 | | - while(left < right){ |
53 | | - const sum = nums[first] +nums[left] + nums[right]; |
54 | | - |
55 | | - if(sum < 0){ |
56 | | - left ++ |
57 | | - }else if(sum > 0){ |
58 | | - right --; |
59 | | - }else{ |
60 | | - result.push([nums[first],nums[left],nums[right]]); |
61 | | - // left, left+1 이 같을 때 중복된 수는 건너뜀 |
62 | | - while(left < right && nums[left] === nums[left+1]) left++; |
63 | | - // right, right+1 이 같을 때 중복된 수는 건너뜀 |
64 | | - while(left < right && nums[right] === nums[right-1]) right--; |
65 | | - left++; |
66 | | - right--; |
67 | | - } |
68 | | - } |
69 | | - } |
70 | | - return result; |
71 | | -} |
0 commit comments