Skip to content

Commit dcde7b3

Browse files
authored
Merge branch 'DaleStudy:main' into main
2 parents 42ae345 + ccec178 commit dcde7b3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+2446
-17
lines changed

โ€Žclone-graph/forest000014.javaโ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public void dfs(Node oldNode) {
7070
Node newNeighbor = createNode(oldNeighbor.val);
7171
newNode.neighbors.add(newNeighbor);
7272
newNeighbor.neighbors.add(newNode);
73-
dfs(oldNeighbor, newNeighbor);
73+
dfs(oldNeighbor);
7474
}
7575
}
7676
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
"""
2+
Solution:
3+
1) ์ˆœํšŒํ•˜๋ฉฐ ์ด์ „ ๊ฐ’์ด ํ˜„์žฌ ๊ฐ’๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋ฉด ํ˜„์žฌ ๊ฐ’์ด ์ตœ์†Œ๊ฐ’์ด๋‹ค.
4+
2) ๋๊นŒ์ง€ ๋Œ์•„๋„ ์ตœ์†Œ๊ฐ’์ด ์—†์„ ๊ฒฝ์šฐ ์ฒซ๋ฒˆ์จฐ ๊ฐ’์ด ์ตœ์†Œ๊ฐ’์ด๋‹ค.
5+
Time: O(n)
6+
Space: O(1)
7+
"""
8+
9+
10+
class Solution:
11+
def findMin(self, nums: List[int]) -> int:
12+
for i in range(1, len(nums)):
13+
if nums[i - 1] >= nums[i]:
14+
return nums[i]
15+
16+
return nums[0]
17+
18+
"""
19+
Solution:
20+
์‹œ๊ฐ„ ๋ณต์žก๋„ O(log n)์œผ๋กœ ํ’€๊ธฐ ์œ„ํ•ด binary search ์‚ฌ์šฉ
21+
Time: O(log n)
22+
Space: O(1)
23+
"""
24+
25+
def findMin(self, nums: List[int]) -> int:
26+
l, r = 1, len(nums) - 1
27+
28+
while l <= r:
29+
mid = (l + r) // 2
30+
# prev ๊ฐ’๋ณด๋‹ค mid ๊ฐ€ ์ž‘์œผ๋ฉด ์ฐพ๋˜ ๊ฐ’
31+
if nums[mid - 1] > nums[mid]:
32+
return nums[mid]
33+
# mid ๊นŒ์ง€ ์ •์ƒ ์ˆœ์„œ๋ฉด ์šฐ์ธก ํƒ์ƒ‰
34+
if nums[0] < nums[mid]:
35+
l = mid + 1
36+
# mid ๊นŒ์ง€ ๋น„ ์ •์ƒ ์ˆœ์„œ๋ฉด ์ขŒ์ธก ํƒ์ƒ‰
37+
else:
38+
r = mid - 1
39+
# ๋ชป์ฐพ์„ ๊ฒฝ์šฐ ์ „์ฒด ์ •์ƒ ์ˆœ์„œ ์ผ€์ด์Šค
40+
return nums[0]
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/**
2+
* @param {number[]} nums
3+
* @return {number}
4+
*/
5+
6+
// Binary Search
7+
// Time Complexity: O(log n) (Binary search halving the search space each step)
8+
// Space Complexity: O(1) (No extra space except for a few variables)
9+
var findMin = function (nums) {
10+
// Example Rotations:
11+
// nums = [0,1,2,4,5,6,7]
12+
// [4,5,6,7,0,1,2] -> Rotated 4 times
13+
// [0,1,2,4,5,6,7] -> 7 times rotated
14+
15+
// Initial State:
16+
// [4, 5, 6, 7, 0, 1, 2]
17+
// โ†‘ โ†‘
18+
// (left) (right)
19+
//
20+
// Find mid:
21+
// [4, 5, 6, 7, 0, 1, 2]
22+
// โ†‘ ๐ŸŽฏ โ†‘
23+
// (left) (mid) (right)
24+
//
25+
// If nums[mid] > nums[right], move left to search in the right half:
26+
// [4, 5, 6, 7, 0, 1, 2]
27+
// โ†‘ โ†‘
28+
// (left) (right)
29+
30+
let left = 0;
31+
let right = nums.length - 1;
32+
33+
while (left < right) {
34+
let mid = Math.floor((left + right) / 2);
35+
36+
if (nums[mid] > nums[right]) {
37+
// Minimum must be in the right half
38+
// Need to update left to search in the right half
39+
left = mid + 1;
40+
} else {
41+
// Minimum is in the left half (including mid)
42+
// Need to update right to search in the left half
43+
right = mid;
44+
}
45+
}
46+
47+
return nums[left];
48+
};
49+
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/**
2+
* ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ ์ตœ์†Œ๊ฐ’ ์ฐพ๊ธฐ
3+
* ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ณต์žก๋„
4+
* - ์‹œ๊ฐ„ ๋ณต์žก๋„: O(logn)
5+
* - ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
6+
* @param nums
7+
*/
8+
function findMin(nums: number[]): number {
9+
// ํ’€์ด 1 - sort() ์‚ฌ์šฉ
10+
// ์‹œ๊ฐ„ ๋ณต์žก๋„: O(nlogn) / ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
11+
// nums.sort((a, b) => a - b)
12+
// return nums[0]
13+
14+
// ํ’€์ด 2 - ๋ฐฐ์—ด์ด ์ •๋ ฌ๋˜์–ด ์žˆ์Œ์„ ํ™œ์šฉํ•œ ํ’€์ด
15+
// ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n) / ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
16+
// let min = nums[0];
17+
// for(let i = 1; i < nums.length; i++) {
18+
// console.log(nums[i])
19+
// min = Math.min(nums[i], min)
20+
// }
21+
// return min
22+
23+
// ์ด๋ถ„ ํƒ์ƒ‰๋ฒ• ํ™œ์šฉ
24+
// ์ ˆ๋ฐ˜์”ฉ ์ž˜๋ผ์„œ nums[n-1] > nums[n] ์˜ ์ง€์ ์„ ์ฐพ๋Š”๋‹ค
25+
let low = 0;
26+
let high = nums.length - 1;
27+
while(low < high) {
28+
let mid = low + Math.floor((high - low) / 2);
29+
30+
if(nums[mid] > nums[high]) {
31+
low = mid + 1;
32+
} else {
33+
high = mid;
34+
}
35+
}
36+
return nums[low]
37+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
'''
2+
# 153. Find Minimum in Rotated Sorted Array
3+
4+
> **why binary search works in a "rotated" sorted array?**
5+
> rotated sorted array consists of **two sorted subarrays**, and the minimum value is the second sorted subarray's first element.
6+
> so ๐Ÿ‘‰ find the point that second sorted subarray starts.
7+
>
8+
> - if nums[mid] > nums[right]? => the pivot point is in the right half.
9+
> - if nums[mid] <= nums[right]? => the pivot point is in the left half.
10+
> - loop until left and right are the same.
11+
'''
12+
class Solution:
13+
'''
14+
## A. brute force(not a solution)
15+
- TC: O(n)
16+
- SC: O(1)
17+
'''
18+
def findMinBF(self, nums: List[int]) -> int:
19+
if len(nums) == 1:
20+
return nums[0]
21+
22+
return min(nums) # check all elements
23+
24+
'''
25+
## B. binary search
26+
- TC: O(log n)
27+
- SC: O(1)
28+
'''
29+
def findMinBS(self, nums: List[int]) -> int:
30+
left = 0
31+
right = len(nums) - 1
32+
33+
while left < right:
34+
mid = (left + right) // 2
35+
36+
if nums[mid] > nums[right]:
37+
left = mid + 1
38+
else:
39+
right = mid
40+
41+
return nums[left]
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/**
2+
input : array of integers
3+
output : minimum element's value
4+
5+
3 4 5 1 2
6+
draw graph
7+
8+
5
9+
4
10+
3
11+
2
12+
1
13+
l r
14+
l r
15+
l r
16+
--------------
17+
5
18+
4
19+
3
20+
2
21+
1
22+
mid right
23+
--------------
24+
left < right ->> sorted.
25+
left < mid ->> don't have to search range [left, mid]
26+
mid > right ->> rotation point is between [mid, right];
27+
28+
solution 1) brute force
29+
read the array
30+
31+
tc : O(n)
32+
sc : O(1);
33+
34+
solution 2) binary search
35+
do binary search, move pointers with descripted conditions
36+
after binary search loop ends, the left pointer is the minimum element
37+
38+
tc : O(logn)
39+
sc : O(1)
40+
*/
41+
42+
class Solution {
43+
public int findMin(int[] nums) {
44+
int l = 0;
45+
int r = nums.length - 1;
46+
while(l < r) {
47+
int mid = (r - l) / 2 + l;
48+
if(nums[mid] < nums[r]) {
49+
r = mid;
50+
} else {
51+
l = mid + 1;
52+
}
53+
}
54+
return nums[l];
55+
}
56+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution {
2+
// TC: O(log N)
3+
// SC: O(1)
4+
public int findMin(int[] nums) {
5+
int left = 0;
6+
int right = nums.length - 1;
7+
while (left < right) {
8+
int mid = left + (right - left) / 2;
9+
if (nums[mid] < nums[right]) {
10+
right = mid;
11+
} else {
12+
left = mid + 1;
13+
}
14+
}
15+
return nums[left];
16+
}
17+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
# Time Complexity: O(logn)
3+
# Space Complexity: O(1)
4+
5+
binary search๋ฅผ ์‚ฌ์šฉํ•ด ์ ‘๊ทผํ–ˆ์Šต๋‹ˆ๋‹ค.
6+
sorted array์ธ ๊ฒฝ์šฐ๋Š” while๋ฌธ ์‹œ์ž‘ ์ „, ์˜ˆ์™ธ ์ฒดํฌ๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค.
7+
binary search๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด, ๊ฐ๊ฐ์˜ loop์˜ mid ์›์†Œ๋Š” ์•„๋ž˜ 4๊ฐ€์ง€ ๊ฒฝ์šฐ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.
8+
maximum / minimum / ์•ž์ชฝ ์ˆ˜์—ด์˜ ์›์†Œ ์ค‘ ํ•˜๋‚˜ / ๋’ค์ชฝ ์ˆ˜์—ด์˜ ์›์†Œ ์ค‘ ํ•˜๋‚˜
9+
maximum์ด๊ฑฐ๋‚˜ minimum์ธ ๊ฒฝ์šฐ๋Š” ๋” ์ด์ƒ ํƒ์ƒ‰ํ•  ํ•„์š” ์—†์ด ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
10+
์•ž์ชฝ ์ˆ˜์—ด์ธ ๊ฒฝ์šฐ, ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” minimum์€ ์™ผ์ชฝ์—๋Š” ์—†์œผ๋ฏ€๋กœ, left ํฌ์ธํ„ฐ๋ฅผ mid์˜ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์˜ฎ๊ธฐ๊ณ  ๋‹ค์Œ loop๋ฅผ ์ง„ํ–‰ํ•˜๊ณ ,
11+
๋’ค์ชฝ ์ˆ˜์—ด์ธ ๊ฒฝ์šฐ, ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” minimum์€ ์˜ค๋ฅธ์ชฝ์—๋Š” ์—†์œผ๋ฏ€๋กœ, rigth ํฌ์ธํ„ฐ๋ฅผ mid์˜ ์™ผ์ชฝ์œผ๋กœ ์˜ฎ๊ธฐ๊ณ  ๋‹ค์Œ loop๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
12+
13+
*/
14+
class Solution {
15+
public int findMin(int[] nums) {
16+
int l = 0;
17+
int r = nums.length - 1;
18+
19+
if (nums[l] <= nums[r]) { // sorted array์ธ ๊ฒฝ์šฐ (size๊ฐ€ 1์ธ ๊ฒฝ์šฐ๋„ ํฌํ•จ)
20+
return nums[l];
21+
}
22+
23+
while (l <= r) {
24+
int m = (r - l) / 2 + l; // ๋งŒ์•ฝ ๋ฌธ์ œ ์กฐ๊ฑด์ƒ l, r์˜ ํ•ฉ์ด int ๋ฒ”์œ„๋ฅผ ๋„˜์–ด๊ฐ€์„œ overflow๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—, ์ด๋Ÿฐ ์‹์œผ๋กœ overflow๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” overflow ๊ฑฑ์ •์€ ์—†์ง€๋งŒ, ๋‚˜์ค‘์— ์‹ค์ „์—์„œ ๋‚˜์˜ค๋ฉด ์žŠ์ง€ ์•Š์œผ๋ ค๊ณ  ์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.
25+
if (m > 0 && nums[m - 1] > nums[m]) {
26+
return nums[m];
27+
} else if (m < nums.length - 1 && nums[m] > nums[m + 1]) {
28+
return nums[m + 1];
29+
} else if (nums[m] > nums[l]) {
30+
l = m + 1;
31+
} else {
32+
r = m - 1;
33+
}
34+
}
35+
36+
return -1;
37+
}
38+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
class Solution {
2+
// ์‹œ๊ฐ„ : O(logN) ๊ณต๊ฐ„ : O(1)
3+
// ์ด๋ถ„ํƒ์ƒ‰.
4+
fun findMin(nums: IntArray): Int {
5+
var left = 0
6+
var right = nums.lastIndex
7+
8+
while (left <= right){
9+
val mid = (left + right)/2
10+
when{
11+
nums[mid-1] > nums[mid] -> {
12+
return nums[mid]
13+
}
14+
nums[0] < nums[mid] -> {
15+
left = mid + 1
16+
}
17+
else -> {
18+
right = mid -1
19+
}
20+
}
21+
}
22+
return nums[0]
23+
}
24+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/**
2+
* Source: https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/
3+
* ํ’€์ด๋ฐฉ๋ฒ•: ์ด์ง„ ํƒ์ƒ‰์„ ์ด์šฉํ•˜์—ฌ ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ์Œ
4+
*
5+
* ์‹œ๊ฐ„๋ณต์žก๋„: O(log n)
6+
* ๊ณต๊ฐ„๋ณต์žก๋„: O(1)
7+
*/
8+
9+
function findMin(nums: number[]): number {
10+
// ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ 1์ธ ๊ฒฝ์šฐ
11+
if (nums.length === 1) return nums[0];
12+
13+
let left: number = 0;
14+
let right: number = nums.length - 1;
15+
16+
// ์ด๋ฏธ ์ •๋ ฌ๋œ ๊ฒฝ์šฐ
17+
if (nums[right] > nums[0]) {
18+
return nums[0];
19+
}
20+
21+
// ์ด์ง„ ํƒ์ƒ‰
22+
while (left <= right) {
23+
const mid: number = Math.floor((left + right) / 2);
24+
25+
// ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ๋Š” ์กฐ๊ฑด๋“ค
26+
if (nums[mid] > nums[mid + 1]) {
27+
return nums[mid + 1];
28+
}
29+
if (nums[mid - 1] > nums[mid]) {
30+
return nums[mid];
31+
}
32+
33+
// ํƒ์ƒ‰ ๋ฒ”์œ„ ์กฐ์ •
34+
if (nums[mid] > nums[0]) {
35+
// ์ตœ์†Ÿ๊ฐ’์€ ์ค‘๊ฐ„์  ์ดํ›„์— ์žˆ์Œ
36+
left = mid + 1;
37+
} else {
38+
// ์ตœ์†Ÿ๊ฐ’์€ ์ค‘๊ฐ„์  ์ด์ „์— ์žˆ์Œ
39+
right = mid - 1;
40+
}
41+
}
42+
43+
return nums[0]; // ๊ธฐ๋ณธ๊ฐ’ ๋ฐ˜ํ™˜
44+
}

0 commit comments

Comments
ย (0)