File tree 3 files changed +153
-0
lines changed
longest-substring-without-repeating-characters 3 files changed +153
-0
lines changed Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments