Skip to content

Commit c21aa5c

Browse files
author
Hamid Gasmi
committed
#238 is completed
1 parent f25cc54 commit c21aa5c

File tree

2 files changed

+172
-0
lines changed

2 files changed

+172
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import random
2+
import heapq
3+
4+
class SolutionQuickSelect:
5+
6+
# Time Complexity: O(n) on average
7+
# Space Complexity: O(1)
8+
def top_k_frequent(self, nums: List[int], k: int) -> List[int]:
9+
10+
occur_dict = dict()
11+
unique = []
12+
for n in nums:
13+
if not n in occur_dict:
14+
unique.append(n)
15+
occur_dict[n] = 0
16+
17+
occur_dict[n] += 1
18+
19+
self._quick_select(unique, occur_dict, k, 0, len(unique) - 1)
20+
21+
return unique[:k]
22+
23+
def _quick_select(self, unique: List[int], occur_dict, k: int, left: int, right: int) -> None:
24+
25+
if left > right:
26+
return
27+
28+
pivot = self._two_partitions(unique, occur_dict, left, right)
29+
if pivot == k:
30+
return
31+
32+
elif pivot < k:
33+
self._quick_select(unique, occur_dict, k, pivot + 1, right)
34+
35+
else:
36+
self._quick_select(unique, occur_dict, k, left, pivot - 1)
37+
38+
def _two_partitions(self, unique: List[int], occur_dict, left: int, right: int) -> None:
39+
40+
pivot = random.randint(left, right)
41+
unique[pivot], unique[right] = unique[right], unique[pivot]
42+
43+
pivot = left - 1
44+
for i in range(left, right):
45+
if occur_dict[ unique[i] ] >= occur_dict[ unique[right] ]:
46+
pivot += 1
47+
unique[pivot], unique[i] = unique[i], unique[pivot]
48+
49+
pivot += 1
50+
unique[pivot], unique[right] = unique[right], unique[pivot]
51+
52+
return pivot
53+
54+
class SolutionHeap:
55+
56+
# Time Complexity: # O(n + k + (n-k)logk)
57+
# Space Complexity: (O(n + k))
58+
def top_k_frequent(self, nums: List[int], k: int) -> List[int]:
59+
# O(n)
60+
occur_dict = dict()
61+
for n in nums:
62+
if not n in occur_dict:
63+
occurence_dict[n] = 0
64+
65+
occur_dict[n] += 1
66+
67+
# O(k + (n-k)logk)
68+
heap = []
69+
for (n, occur) in occur_dict.items():
70+
len_heap = len(heap)
71+
if len_heap == k:
72+
# O(2 * (n - k)logk) = O((n - k)logk)
73+
if occur > heap[0][0]:
74+
heapq.heapreplace(heap, (occur, n))
75+
76+
else:
77+
# O(k * 1)
78+
heap.append((occur, n))
79+
80+
if len_heap == k - 1:
81+
# 1 * O(k)
82+
heapq.heapify(heap)
83+
84+
# O(k)
85+
return [n for (occur, n) in heap]
86+

lc_347_top_k_frequent_element.py

+86
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import random
2+
import heapq
3+
4+
class SolutionQuickSelect:
5+
6+
# Time Complexity: O(n) on average
7+
# Space Complexity: O(1)
8+
def top_k_frequent(self, nums: List[int], k: int) -> List[int]:
9+
10+
occur_dict = dict()
11+
unique = []
12+
for n in nums:
13+
if not n in occur_dict:
14+
unique.append(n)
15+
occur_dict[n] = 0
16+
17+
occur_dict[n] += 1
18+
19+
self._quick_select(unique, occur_dict, k, 0, len(unique) - 1)
20+
21+
return unique[:k]
22+
23+
def _quick_select(self, unique: List[int], occur_dict, k: int, left: int, right: int) -> None:
24+
25+
if left > right:
26+
return
27+
28+
pivot = self._two_partitions(unique, occur_dict, left, right)
29+
if pivot == k:
30+
return
31+
32+
elif pivot < k:
33+
self._quick_select(unique, occur_dict, k, pivot + 1, right)
34+
35+
else:
36+
self._quick_select(unique, occur_dict, k, left, pivot - 1)
37+
38+
def _two_partitions(self, unique: List[int], occur_dict, left: int, right: int) -> None:
39+
40+
pivot = random.randint(left, right)
41+
unique[pivot], unique[right] = unique[right], unique[pivot]
42+
43+
pivot = left - 1
44+
for i in range(left, right):
45+
if occur_dict[ unique[i] ] >= occur_dict[ unique[right] ]:
46+
pivot += 1
47+
unique[pivot], unique[i] = unique[i], unique[pivot]
48+
49+
pivot += 1
50+
unique[pivot], unique[right] = unique[right], unique[pivot]
51+
52+
return pivot
53+
54+
class SolutionHeap:
55+
56+
# Time Complexity: # O(n + k + (n-k)logk)
57+
# Space Complexity: (O(n + k))
58+
def top_k_frequent(self, nums: List[int], k: int) -> List[int]:
59+
# O(n)
60+
occur_dict = dict()
61+
for n in nums:
62+
if not n in occur_dict:
63+
occurence_dict[n] = 0
64+
65+
occur_dict[n] += 1
66+
67+
# O(k + (n-k)logk)
68+
heap = []
69+
for (n, occur) in occur_dict.items():
70+
len_heap = len(heap)
71+
if len_heap == k:
72+
# O(2 * (n - k)logk) = O((n - k)logk)
73+
if occur > heap[0][0]:
74+
heapq.heapreplace(heap, (occur, n))
75+
76+
else:
77+
# O(k * 1)
78+
heap.append((occur, n))
79+
80+
if len_heap == k - 1:
81+
# 1 * O(k)
82+
heapq.heapify(heap)
83+
84+
# O(k)
85+
return [n for (occur, n) in heap]
86+

0 commit comments

Comments
 (0)