Skip to content

Commit e014aea

Browse files
committed
feat: solve week7
1 parent 774aaf7 commit e014aea

File tree

3 files changed

+153
-0
lines changed

3 files changed

+153
-0
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package leetcode_study
2+
3+
/**
4+
* 시간복잡도 : O(n) ?
5+
* -
6+
* 공간복잡도 : O(n)
7+
* - charAndIdx 에 최대 n개의 문자에 대해서 담을 수 있으므로 O(n) 의 공간복잡도를 가집니다.
8+
* */
9+
10+
fun lengthOfLongestSubstring(s: String): Int {
11+
var point = 0
12+
val charAndIdx = HashMap<Char, Int>()
13+
var cnt = 0
14+
var maxCnt = 0
15+
16+
while (point < s.length) {
17+
val nowChar = s[point]
18+
if (nowChar !in charAndIdx.keys) {
19+
charAndIdx[nowChar] = point
20+
cnt += 1
21+
point += 1
22+
} else {
23+
val prevSameCharIdx = charAndIdx[nowChar]!!
24+
point = prevSameCharIdx + 1
25+
charAndIdx.clear()
26+
cnt = 0
27+
}
28+
29+
maxCnt = maxOf(cnt, maxCnt)
30+
}
31+
32+
return maxCnt
33+
}

number-of-islands/Real-Reason.kt

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package leetcode_study
2+
3+
/**
4+
* n: rowSize, m: colSize
5+
* 시간복잡도 : O(n*m)
6+
* - 전체 그리드를 한번씩만 방문하므로, 시간복잡도는 O(n*m) 과 같습니다.
7+
* 공간복잡도 : O(n*m)
8+
* - 방문이력에 대해 visited 를 저장하므로, 시간복잡도는 O(n*m) 과 같습니다.
9+
* */
10+
class NumberOfIsland {
11+
val directions = listOf(
12+
Pair(-1, 0),
13+
Pair(1, 0),
14+
Pair(0, -1),
15+
Pair(0, 1)
16+
)
17+
var rowSize = 0
18+
var colSize = 0
19+
var visited: Array<BooleanArray>? = null
20+
21+
fun numIslands(grid: Array<CharArray>): Int {
22+
rowSize = grid.size
23+
colSize = grid[0].size
24+
visited = Array(rowSize) { BooleanArray(colSize) }
25+
26+
var islandCnt = 0
27+
28+
for (i in 0 until rowSize) {
29+
for (j in 0 until colSize) {
30+
if (grid[i][j] == '1' && !visited!![i][j]) {
31+
dfs(i, j, grid)
32+
islandCnt += 1
33+
}
34+
}
35+
}
36+
37+
return islandCnt
38+
}
39+
40+
fun dfs(r: Int, c: Int, grid: Array<CharArray>) {
41+
visited!![r][c] = true
42+
43+
for ((dr, dc) in directions) {
44+
val (nr, nc) = Pair(r + dr, c + dc)
45+
if (isValid(nr, nc, grid)) {
46+
dfs(nr, nc, grid)
47+
}
48+
}
49+
}
50+
51+
private fun isValid(r: Int, c: Int, grid: Array<CharArray>): Boolean {
52+
return r in 0 until rowSize &&
53+
c in 0 until colSize &&
54+
grid[r][c] == '1' &&
55+
!visited!![r][c]
56+
}
57+
}

reverse-linked-list/Real-Reason.kt

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package leetcode_study
2+
3+
/**
4+
* 첫번째 문제풀이
5+
* 시간복잡도 : O(n)
6+
* - n 번을 순회하며 nodes 에 저장하고, 다시 nodes 에서 노드를 하나씩 꺼내어 연산하므로 O(2n) -> O(n) 입니다.
7+
* 공간복잡도 : O(n)
8+
* - n 개의 노드를 nodes 에 저장하므로 O(n) 입니다.
9+
*
10+
* 두번째 문제풀이
11+
* 시간복잡도 : O(n)
12+
* - curr 이 null 일때까지 while 문을 돌고 있으므로, n번의 순회가 발생할 것입니다. 따라서 시간복잡도는 O(n) 입니다.
13+
* 공간복잡도 : O(1)
14+
* - nodes 를 저장했던 첫번째 풀이와 달리 prev, curr 두개의 상수만을 사용하므로 O(1) 만큼의 공간복잡도를 가집니다.
15+
* */
16+
class ReverseLinkedList {
17+
class ListNode(var `val`: Int) {
18+
var next: ListNode? = null
19+
}
20+
21+
fun reverseList(head: ListNode?): ListNode? {
22+
var nowNode = head
23+
val nodes = mutableListOf<ListNode>()
24+
25+
while (nowNode != null) {
26+
nodes.add(nowNode)
27+
nowNode = nowNode.next
28+
}
29+
30+
val dummy = ListNode(-1)
31+
nowNode = dummy
32+
33+
while (nodes.isNotEmpty()) {
34+
val popNode = nodes.removeLast()
35+
nowNode?.next = popNode
36+
nowNode = nowNode?.next
37+
}
38+
39+
nowNode?.next = null
40+
41+
return dummy.next
42+
}
43+
}
44+
45+
class ReverseLinkedList2 {
46+
class ListNode(var `val`: Int) {
47+
var next: ListNode? = null
48+
}
49+
50+
fun reverseList(head: ListNode?): ListNode? {
51+
var prev: ListNode? = null
52+
var curr = head
53+
54+
while (curr != null) {
55+
val temp = curr.next
56+
curr.next = prev
57+
prev = curr
58+
curr = temp
59+
}
60+
61+
return prev
62+
}
63+
}

0 commit comments

Comments
 (0)