forked from DaleStudy/leetcode-study
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclara-shin.js
More file actions
76 lines (62 loc) ยท 2.45 KB
/
clara-shin.js
File metadata and controls
76 lines (62 loc) ยท 2.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/**
* ๋ฐฐ์ด์์ ํฉ์ด 0์ด ๋๋ ์ธ ์ซ์๋ฅผ ์ฐพ๊ธฐ
*
* ์๊ตฌ์ฌํญ & ์ ์ฝ์กฐ๊ฑด:
* ์ธ ๊ฐ์ ๋ค๋ฅธ ์ธ๋ฑ์ค์ ์๋ ์ซ์๋ค์ ํฉ์ด 0์ด ๋์ด์ผ ํจ
* ๊ฒฐ๊ณผ์ ์ค๋ณต๋ ์กฐํฉ์ด ์์ด์ผ ํจ
* ๋ฐฐ์ด ํฌ๊ธฐ๋ 3์์ 3000๊น์ง
* ๋ฐฐ์ด ์์๋ -10^5๋ถํฐ 10^5๊น์ง์ ์ ์
*
* ์ ๊ทผ๋ฐฉ๋ฒ:
* 1. ๋ธ๋ฃจํธํฌ์ค(์ด์คfor๋ฌธ, ์์ ํ์) - O(n^3) ์๊ฐ๋ณต์ก๋
* 2. ์ ๋ ฌ ํ ํฌ ํฌ์ธํฐ - O(n^2) ์๊ฐ๋ณต์ก๋ โ
*
* ๋ฐฐ์ด์ ์ ๋ ฌ ํ, ๋ฐฐ์ด์ ์ํํ๋ฉฐ ๊ฐ ์์๋ฅผ ์ฒซ ๋ฒ์งธ ์ซ์๋ก ๊ณ ์
* ๊ณ ์ ๋ ์ซ์ ๋ค์๋ถํฐ ~ ๋ฐฐ์ด ๋๊น์ง ํฌ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉ โก๏ธ ๋๋จธ์ง ๋ ์์ ํฉ์ด ์ฒซ ๋ฒ์งธ ์์ ์์๊ฐ ๋๋ ์กฐํฉ ์ฐพ๊ธฐ
* ์ค๋ณต์ ํผํ๊ธฐ ์ํด ๊ฐ์ ๊ฐ์ ๊ฐ์ง ์ฐ์๋ ์์๋ ์คํต
*/
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function (nums) {
const result = [];
const n = nums.length;
if (n < 3) return result;
nums.sort((a, b) => a - b); // ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
if (nums[0] > 0 || nums[n - 1] < 0) return result;
// ๋ฐฐ์ด์ ์ํํ๋ฉฐ ์ฒซ ๋ฒ์งธ ์ซ์ ๊ณ ์
for (let i = 0; i < n - 2; i++) {
// ์ค๋ณต๋ ๊ฐ ๊ฑด๋๋ฐ๊ธฐ (์ฒซ ๋ฒ์งธ ์ซ์)
if (i > 0 && nums[i] === nums[i - 1]) continue;
// ์ฒซ ๋ฒ์งธ ์ซ์๊ฐ ์์๋ฉด for๋ฌธ ํ์ถ
if (nums[i] > 0) break;
// ํ์ฌ ์ซ์์ ๊ฐ์ฅ ์์ ๋ ์ซ์์ ํฉ > 0 => ํ์ถ
if (nums[i] + nums[i + 1] + nums[i + 2] > 0) break;
// ํ์ฌ ์ซ์์ ๊ฐ์ฅ ํฐ ๋ ์ซ์์ ํฉ < 0 => ๊ฑด๋๋ฐ๊ธฐ
if (nums[i] + nums[n - 2] + nums[n - 1] < 0) continue;
// ๋ ๋ฒ์งธ, ์ธ ๋ฒ์งธ ์ซ์๋ฅผ ์ฐพ๊ธฐ ์ํ ํฌ ํฌ์ธํฐ
let left = i + 1;
let right = n - 1;
while (left < right) {
const sum = nums[i] + nums[left] + nums[right];
if (sum < 0) {
// ํฉ์ด 0๋ณด๋ค ์์ผ๋ฉด left ํฌ์ธํฐ๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋
left++;
} else if (sum > 0) {
// ํฉ์ด 0๋ณด๋ค ํฌ๋ฉด right ํฌ์ธํฐ๋ฅผ ์ผ์ชฝ์ผ๋ก ์ด๋
right--;
} else {
// ํฉ์ด 0์ด๋ฉด ๊ฒฐ๊ณผ์ ์ถ๊ฐ
result.push([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--;
}
}
}
return result;
};