Skip to content

Commit 8ac18b1

Browse files
authored
Merge pull request #367 from bubbleship/main
Update 347-Top-K-Frequent-Elements.java
2 parents 5c3d533 + d805404 commit 8ac18b1

File tree

1 file changed

+59
-1
lines changed

1 file changed

+59
-1
lines changed

java/347-Top-K-Frequent-Elements.java

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
class Solution {
1+
class Solution1 {
2+
/**
3+
* Time Complexity: O(nlog(k))
4+
* Space Complexity: O(n)
5+
*/
26
public int[] topKFrequent(int[] nums, int k) {
37
int[] arr = new int[k];
48
HashMap<Integer, Integer> map = new HashMap<>();
@@ -17,3 +21,57 @@ public int[] topKFrequent(int[] nums, int k) {
1721
return arr;
1822
}
1923
}
24+
25+
class Solution2 {
26+
/**
27+
* Time Complexity: O(n)
28+
* Space Complexity: O(n)
29+
*/
30+
public int[] topKFrequent(int[] numbers, int k) {
31+
HashMap<Integer, Integer> map = new HashMap<>();
32+
for (int number : numbers)
33+
map.put(number, map.getOrDefault(number, 0) + 1);
34+
35+
int size = map.size();
36+
int[] keys = new int[size];
37+
int i = 0;
38+
for (int key : map.keySet())
39+
keys[i++] = key;
40+
41+
select(keys, map, 0, size - 1, size - k);
42+
return Arrays.copyOfRange(keys, size - k, size);
43+
}
44+
45+
// Modified implementation of Hoare's selection algorithm:
46+
47+
private void select(int[] keys, Map<Integer, Integer> map, int left, int right, int kSmallest) {
48+
while (left != right) {
49+
int pivot = partition(keys, map, left, right, (left + right) / 2);
50+
51+
if (kSmallest == pivot) return;
52+
53+
if (kSmallest < pivot) right = pivot - 1;
54+
else left = pivot + 1;
55+
}
56+
}
57+
58+
private int partition(int[] keys, Map<Integer, Integer> map,int left, int right, int pivot) {
59+
int pivotValue = map.get(keys[pivot]);
60+
swap(keys, pivot, right);
61+
int index = left;
62+
63+
for (int i = left; i <= right; i++)
64+
if (map.get(keys[i]) < pivotValue) {
65+
swap(keys, i, index);
66+
index++;
67+
}
68+
swap(keys, right, index);
69+
return index;
70+
}
71+
72+
private void swap(int[] array, int i1, int i2) {
73+
int temp = array[i1];
74+
array[i1] = array[i2];
75+
array[i2] = temp;
76+
}
77+
}

0 commit comments

Comments
 (0)