Skip to content

Commit 7e3a732

Browse files
committed
[20200711] Solve problems
1 parent 0e09c24 commit 7e3a732

File tree

5 files changed

+210
-0
lines changed

5 files changed

+210
-0
lines changed

β€ŽREADME.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@
210210
| [1014](https://leetcode.com/problems/best-sightseeing-pair/) | Best Sightseeing Pair | medium | [python](πŸ€”medium/1014.Best-Sightseeing-Pair/best_sightseeing_pair.py) | |
211211
| [1019](https://leetcode.com/problems/next-greater-node-in-linked-list/) | Next Greater Node In Linked List | medium | [python](πŸ€”medium/1019.Next-Greater-Node-In-Linked-List/next_greater_node_in_linked_list.py) | |
212212
| [1025](https://leetcode.com/problems/divisor-game/) | Divisor Game | easy | [python](πŸ™‚easy/1025.Divisor-Game/divisor_game.py) | |
213+
| [1027](https://leetcode.com/problems/longest-arithmetic-sequence/) | Longest Arithmetic Sequence | meidum | [python](πŸ€”medium/1027.Longest-Arithmetic0Sequence/longest_arithmetic_sequence.py) | |
213214
| [1114](https://leetcode.com/problems/print-in-order/) | Print in Order | easy | [python](πŸ™‚easy/1114.Print-in-Order/print_in_order.py) | |
214215
| [1122](https://leetcode.com/problems/relative-sort-array/) | Relative Sort Array | easy | [python](πŸ™‚easy/1122.Relative-Sort-Array/relative_sort_array.py) | |
215216
| [1128](https://leetcode.com/problems/number-of-equivalent-domino-pairs/) | Number of Equivalent Domino Pairs | easy | [python](πŸ™‚easy/1128.Number-of-Equivalent-Domino-Pairs/number_of_equivalent_domino_pairs.py) | |
@@ -229,3 +230,4 @@
229230
| [Hamming Distance](https://leetcode.com/explore/challenge/card/july-leetcoding-challenge/544/week-1-july-1st-july-7th/3381/) | [python](challenge/2020/july/Hamming_Distance.py) | [solutions](challenge/2020/july/Hamming_Distance.md)|
230231
| [Plus One](https://leetcode.com/explore/challenge/card/july-leetcoding-challenge/544/week-1-july-1st-july-7th/3382/) | [python](challenge/2020/july/Plus_One.py) | [solutions](challenge/2020/july/Plus_One.md)|
231232
| [Island Perimeter](https://leetcode.com/explore/challenge/card/july-leetcoding-challenge/544/week-1-july-1st-july-7th/3383/) | [python](challenge/2020/july/Island_Perimeter.py) | [solutions](challenge/2020/july/Island_Perimeter.md)|
233+
| [Flatten a Multilevel Doubly Linked List](https://leetcode.com/explore/challenge/card/july-leetcoding-challenge/545/week-2-july-8th-july-14th/3386/) | [python](challenge/2020/july/Flatten_a_Multilevel_Doubly_Linked_List.py) | [solutions](challenge/2020/july/Flatten_a_Multilevel_Doubly_Linked_List.md)|
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
## 문제
2+
3+
doubly linked list λ₯Ό flatten ν•˜κ²Œ λ§Œλ“œλŠ” λ¬Έμ œλ‹€.
4+
λ‹€λ§Œ 일만 linked list λž‘ λ‹€λ₯΄κ²Œ child κ°€ 있고, 이 child 의 μš°μ„ μˆœμœ„κ°€ 더 λ†’μ•„μ•Ό ν•œλ‹€(?) λŠ” 것이닀.
5+
6+
### μ†”λ£¨μ…˜
7+
child κ°€ λ¨Όμ € μ„ ν–‰ λ˜μ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— depth λ₯Ό 두고, queue λ₯Ό heap 으둜 μ¨μ„œ(child λ₯Ό queue μ—μ„œ λ¨Όμ € κΊΌλ‚΄λ €κ³ ) bfs 둜 ν’€μ—ˆλ‹€.
8+
9+
μ½”λ“œ μ°Έκ³ 
10+
```python3
11+
class Solution:
12+
def flatten(self, head: 'Node') -> 'Node':
13+
14+
if head is None:
15+
return None
16+
17+
heap = []
18+
19+
item = (0, head)
20+
heappush(heap, item)
21+
22+
dummy = Node(0, None, None, None)
23+
result = dummy
24+
25+
while heap:
26+
depth, node = heappop(heap)
27+
28+
dummy.next = node
29+
node.prev = dummy
30+
31+
if node.child is not None:
32+
heappush(heap, (depth - 1, node.child))
33+
if node.next is not None:
34+
heappush(heap, (depth, node.next))
35+
36+
dummy = dummy.next
37+
dummy.next = None
38+
dummy.child = None
39+
40+
ret = result.next
41+
ret.prev = None
42+
return ret
43+
```
44+
45+
근데 막상 ν’€κ³ λ‚˜λ‹ˆκΉŒ stack 으둜 ν•  수 μžˆλ”λΌ. next λ₯Ό λ¨Όμ € λ„£κ³  child λ₯Ό λ‚˜μ€‘μ— λ„£λŠ” μ‹μœΌλ‘œ ν•˜λ©΄ LIFO 이기 λ•Œλ¬Έμ— child κ°’λ§Œ λ¨Όμ € 확인 κ°€λŠ₯ν•˜λ‹€(!)
46+
47+
### 주저리
48+
κ²°κ³Ό 값이 doubly linked list κ°€ μ•„λ‹ˆλž˜μ„œ ν•œμ°Έ ν—€λ§ΈλŠ”λ°... μ•Œκ³ λ³΄λ‹ˆ dummy 둜 μ€€ 첫번째 dummy head κ°€ κ²°κ³Ό 값에 포함 λ˜μ—ˆμ—ˆκΈ° λ•Œλ¬Έμ΄μ—ˆλ‹€.
49+
50+
그리고 ν•œλ²ˆ ν‹€λ ΈλŠ”λ° (γ… γ… ) None 이 input 으둜 λ“€μ–΄μ˜€λŠ” 것을 확인 λͺ»ν–ˆλ‹€. 제발... κ²€ν† λ₯Ό ν™•μ‹€νžˆ ν•˜μž!!
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# 2020.07.11
2+
# Flatten a Multilevel Doubly Linked List
3+
4+
from heapq import heappop, heappush
5+
6+
7+
# Definition for a Node.
8+
class Node:
9+
def __init__(self, val, prev=None, next=None, child=None):
10+
self.val = val
11+
self.prev = prev
12+
self.next = next
13+
self.child = child
14+
15+
16+
class Solution:
17+
def flatten(self, head: 'Node') -> 'Node':
18+
19+
if head is None:
20+
return None
21+
22+
heap = []
23+
24+
item = (0, head)
25+
heappush(heap, item)
26+
27+
dummy = Node(0, None, None, None)
28+
result = dummy
29+
30+
while heap:
31+
depth, node = heappop(heap)
32+
33+
dummy.next = node
34+
node.prev = dummy
35+
36+
if node.child is not None:
37+
heappush(heap, (depth - 1, node.child))
38+
if node.next is not None:
39+
heappush(heap, (depth, node.next))
40+
41+
dummy = dummy.next
42+
dummy.next = None
43+
dummy.child = None
44+
45+
ret = result.next
46+
ret.prev = None
47+
return ret
48+
49+
50+
if __name__ == '__main__':
51+
node = Node(1)
52+
node2 = Node(2)
53+
54+
node.next = node2
55+
node2.prev = node
56+
57+
node.child = Node(3)
58+
59+
sol = Solution()
60+
result = sol.flatten(node)
61+
62+
while result is not None:
63+
print(result.val)
64+
result = result.next
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# 1027. Longest Arithmetic Sequence
2+
# https://leetcode.com/problems/longest-arithmetic-sequence/
3+
4+
from typing import List
5+
from collections import defaultdict
6+
7+
8+
class Solution:
9+
def longestArithSeqLength(self, A: List[int]) -> int:
10+
dp = defaultdict(int)
11+
result = 0
12+
13+
for i in range(len(A) - 1):
14+
for j in range(i + 1, len(A)):
15+
diff = A[i] - A[j]
16+
if (i, diff) in dp:
17+
dp[(j, diff)] = dp[(i, diff)] + 1
18+
else:
19+
dp[(j, diff)] = 2
20+
result = max(result, dp[(j, diff)])
21+
22+
return result
23+
24+
25+
if __name__ == '__main__':
26+
sol = Solution()
27+
28+
assert sol.longestArithSeqLength([20, 1, 15, 3, 10, 5, 8]) == 4
29+
assert sol.longestArithSeqLength([9, 4, 7, 2, 10]) == 3
30+
assert sol.longestArithSeqLength([3, 6, 9, 12]) == 4
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
## 문제
2+
λ°°μ—΄μ—μ„œ κ°€μž₯ κΈ΄ arithmetic sequence λ₯Ό μ°ΎλŠ” λ¬Έμ œλ‹€.
3+
arithmetic sequence λž€ λ°°μ—΄ A[i], A[i+1], A[i+2] ... κ°€ μžˆμ„ λ•Œ 각 μ›μ†Œμ˜ κ°’μ˜ 차이가 λ˜‘κ°™μ€ μ‹œν€€μŠ€ 예λ₯Ό λ“€λ©΄
4+
5+
- `[3, 6, 9, 12, 13]` μ΄λž€ 배열이 μžˆμ„ λ•Œ `[3, 6, 9, 12]` λŠ” +3 의 차이둜 이루어진 κ°€μž₯ κΈ΄ 배열이 λœλ‹€.
6+
- `[9, 4, 7, 2, 10]` 일 κ²½μš°μ—” [`4, 7, 10]`이 +3 으둜 κ°€μž₯ 길게 κ°€μ§ˆ 수 μžˆλŠ” 배열이 λœλ‹€.
7+
8+
## μ†”λ£¨μ…˜
9+
μ›μ†Œλ“€μ˜ 차이λ₯Ό μ΄μš©ν•œ dp 둜 ν’€ 수 μžˆλ‹€.
10+
11+
그림은 μ•„λž˜λ₯Ό μ°Έκ³ ν•˜λ©΄ 쒋을 것 κ°™λ‹€.
12+
[μ°Έκ³ ](https://medium.com/algorithm-and-datastructure/longest-arithmetic-sequence-567cc4eea949)
13+
14+
`[9, 4, 7, 2, 10]` 의 경우 κ°€μž₯ κΈ΄ 배열은 `[4, 7, 10]` 이닀.
15+
이λ₯Ό λ‚˜λˆ μ„œ 생각해보면 λ°°μ—΄μ˜ 값은 `[4, 7]` κ³Ό `[7, 10]` 의 쑰합이닀. 즉 μ–΄λ–€ arithmetic sequence λ₯Ό 이루렀면
16+
μž„μ˜μ˜ λ°°μ—΄ A[i,j] 와 λ°°μ—΄ A[j,k] 의 μ‘°ν•©λ“€λ‘œ 이루어져야 ν•œλ‹€λŠ” 것이닀. 그리고 이 각각의 λ°°μ—΄μ—μ„œ A[j] - A[i]와 A[k] - A[j]λŠ” κ°™μ•„μ•Ό ν•œλ‹€.
17+
18+
19+
dp[(i, diff)] λŠ” i 번째 μΈλ±μŠ€μ™€ i 번째 μΈλ±μŠ€μ—μ„œ i+1 ~ k μΈλ±μŠ€μ™€μ˜ 비ꡐ값 diff 의 count λ₯Ό μ˜λ―Έν•œλ‹€.
20+
21+
예둜 보면 dp[(1, 3)] 은 A[1] 인 4μ—μ„œ +3 이 λ‚˜μ˜¨ νšŸμˆ˜μ΄λ‹€. (그리고 κ·Έ 값은 A[2] 인 7μ—μ„œ count λ˜μ—ˆμ„ 것이닀.)
22+
그리고 λ‹€μŒ λ£¨ν”„μ—μ„œ dp[(2, 3)] μ΄λž€ 값이 λ‚˜μ˜¬ 텐데, μ—¬κΈ°μ„œ λ§ˆμ°¬κ°€μ§€λ‘œ A[2] 와 A[4] 의 차이 +3 이 λ‚˜μ˜¨ count λ‹€.
23+
24+
> μ½”λ“œμ—μ„œλŠ” 4-7 을 ν•΄μ„œ 사싀은 -3 μ΄λž€ 값이 λ“€μ–΄κ°€μ§€λ§Œ μ„€λͺ…에선 ν—·κ°ˆλ¦¬λ―€λ‘œ +3 이라고 ν•œλ‹€. μ–΄μ°¨ν”Ό abs ν•˜μ§€ μ•ŠλŠ” 이상 diff λŠ” 상관 μ—†λ‹€.
25+
26+
이걸 μ½”λ“œλ‘œ 보면 μ•„λž˜μ™€ κ°™λ‹€
27+
28+
```python3
29+
dp[(j, diff)] = dp[(i, diff)] + 1
30+
```
31+
32+
i λ²ˆμ§Έμ—μ„œ λ°œμƒν•œ diff μΉ΄μš΄νŒ… ν•œ 값에 1을 λ”ν•˜λ©΄ j 번째 λ°œμƒν•œ diff μΉ΄μš΄νŒ…μ΄ λœλ‹€λŠ” 것이닀. diff λŠ” κ°™μ•„μ•Ό ν•˜κ³  (arithmetic sequence!)
33+
λΆ€λΆ„ λ°°μ—΄μ˜ 쑰합을 생각해야 ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. (예λ₯Ό λ“€λ©΄ `[4, 7, 11, 14]` μ—μ„œ 4와 7은 +3, 11κ³Ό 14λŠ” +3 μ΄μ§€λ§Œ 4개λ₯Ό 같이 봀을 λ•Œ +3 으둜 이루어진 μ‹œν€€μŠ€λŠ” μ•„λ‹ˆλ‹€!)
34+
35+
36+
μ˜ˆμ œμ—μ„œ λ‚˜μ™”λ˜ `[9, 4, 7, 2, 10]` 의 κ²°κ³Ό λ°°μ—΄ `[4, 7, 10]` 의 길이 값은
37+
38+
1. dp[(2, 3)] μΉ΄μš΄νŒ… (μ½”λ“œμ—μ„  2λ₯Ό λ„£μ–΄μ€Œ)
39+
2. dp[(4, 3)] = dp[(2, 3)] + 1
40+
41+
처럼 λœλ‹€.
42+
43+
44+
### μ½”λ“œ
45+
```python3
46+
class Solution:
47+
def longestArithSeqLength(self, A: List[int]) -> int:
48+
dp = defaultdict(int)
49+
result = 0
50+
51+
for i in range(len(A) - 1):
52+
for j in range(i + 1, len(A)):
53+
diff = A[i] - A[j]
54+
if (i, diff) in dp:
55+
dp[(j, diff)] = dp[(i, diff)] + 1
56+
else:
57+
dp[(j, diff)] = 2
58+
result = max(result, dp[(j, diff)])
59+
60+
return result
61+
```
62+
63+
i λ²ˆμ§Έμ—μ„œ diff λž€ 값이 없을 λ•Œ 2λ₯Ό λ„£μ–΄μ€€ μ΄μœ λŠ” 배열이 [4, 10] 만 μžˆλ‹€κ³  보면 +5 둜 κ²°κ³Ό 값이 2κ°€ 되기 λ•Œλ¬Έμ΄λ‹€.
64+
즉 λ°°μ—΄μ˜ μ‚¬μ΄μ¦ˆκ°€ 0 λ˜λŠ” 1이 μ•„λ‹Œ 이상 무쑰건 μ΅œμ†Œ 값은 2κ°€ λœλ‹€.

0 commit comments

Comments
Β (0)