Skip to content

Commit a38cba9

Browse files
committed
Top K frequenct elements
1 parent 6971f27 commit a38cba9

File tree

5 files changed

+146
-0
lines changed

5 files changed

+146
-0
lines changed

src/main/java/joshua/leetcode/design/MedianFinder.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
package joshua.leetcode.design;
44

5+
import joshua.leetcode.solutiontag.MinHeap;
6+
57
import java.util.PriorityQueue;
68

79
/**
@@ -53,10 +55,12 @@ public abstract class MedianFinder {
5355
* 如果两个堆大小相差1,则median就是aHeap的栈顶元素。
5456
*
5557
* 在Java中,PriorityQueue的内部实现就是min Heap。
58+
*
5659
* 这样PriorityQueue的头部对应min heap的栈顶。压入栈的操作等同于入队操作,优先队列会调整栈顶元素使其最小。
5760
* 至于MaxHeap可以使用元素的负值插入到priorityQueue中,这样队列头部的元素的相反值就是最大值了,实现了max heap的作用。
5861
*
5962
*/
63+
@MinHeap
6064
public static class Solution1 extends MedianFinder {
6165

6266
/**
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package joshua.leetcode.heap;
2+
3+
import com.google.common.collect.Lists;
4+
import joshua.leetcode.solutiontag.BucketSort;
5+
import joshua.leetcode.solutiontag.MinHeap;
6+
7+
import java.util.*;
8+
9+
/**
10+
* 347. Top K Frequent Elements</br>
11+
* <p/>
12+
* <a href = "https://leetcode.com/problems/top-k-frequent-elements/">leetcode link</a>
13+
* <p/>
14+
* Created by joshu on 2016/5/24.
15+
*/
16+
public abstract class TopKFrequentElements {
17+
18+
public abstract List<Integer> topKFrequent(int[] nums, int k);
19+
20+
21+
@MinHeap
22+
public static class Solution1 extends TopKFrequentElements {
23+
24+
@Override
25+
public List<Integer> topKFrequent(int[] nums, int k) {
26+
Arrays.sort(nums);
27+
// in java priority queue is implemented by min stack, the element at head is the minimum of queue.
28+
PriorityQueue<QueueItem> minStack = new PriorityQueue<QueueItem>();
29+
for (int i = 0; i < nums.length; i++) {
30+
int count = 1;
31+
while (i + 1 < nums.length && nums[i] == nums[i + 1]) {
32+
count++;
33+
i++;
34+
}
35+
minStack.offer(new QueueItem(nums[i], count));
36+
}
37+
List<Integer> topK = Lists.newArrayList();
38+
for (int j = 0; j < k; j++) {
39+
topK.add(minStack.poll().val);
40+
}
41+
return topK;
42+
}
43+
44+
class QueueItem implements Comparable<QueueItem> {
45+
int val;
46+
int frequency;
47+
48+
public QueueItem(int val, int frequency) {
49+
this.val = val;
50+
this.frequency = frequency;
51+
}
52+
53+
@Override
54+
public int compareTo(QueueItem o) {
55+
return o.frequency - frequency;
56+
}
57+
}
58+
}
59+
60+
@BucketSort
61+
public static class Solution2 extends TopKFrequentElements {
62+
63+
@Override
64+
public List<Integer> topKFrequent(int[] nums, int k) {
65+
Arrays.sort(nums);
66+
Map<Integer, List<Integer>> frequencyBucket = new HashMap<Integer, List<Integer>>();
67+
int maxFrequency = 0;
68+
for (int i = 0; i < nums.length; i++) {
69+
int count = 1;
70+
while (i + 1 < nums.length && nums[i] == nums[i + 1]) {
71+
count++;
72+
i++;
73+
}
74+
if (!frequencyBucket.containsKey(count)) {
75+
frequencyBucket.put(count, new ArrayList<Integer>());
76+
}
77+
frequencyBucket.get(count).add(nums[i]);
78+
maxFrequency = Math.max(maxFrequency, count);
79+
}
80+
List<Integer> topK = new ArrayList<Integer>();
81+
int size = 0;
82+
for (int i = maxFrequency; i > 0; i--) {
83+
if (!frequencyBucket.containsKey(i)) {
84+
continue;
85+
}
86+
for (Integer ele : frequencyBucket.get(i)) {
87+
topK.add(ele);
88+
size++;
89+
if (size == k) {
90+
break;
91+
}
92+
}
93+
if (size == k) {
94+
break;
95+
}
96+
}
97+
return topK;
98+
}
99+
}
100+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package joshua.leetcode.solutiontag;
2+
3+
/**
4+
* Created by joshu on 2016/5/24.
5+
*/
6+
public @interface BucketSort {
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package joshua.leetcode.solutiontag;
2+
3+
/**
4+
* Created by joshu on 2016/5/24.
5+
*/
6+
public @interface MinHeap {
7+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package joshua.leetcode.heap;
2+
3+
import com.google.common.collect.Lists;
4+
import org.junit.Before;
5+
import org.junit.Test;
6+
7+
import java.util.List;
8+
9+
import static org.junit.Assert.*;
10+
11+
/**
12+
* Created by joshu on 2016/5/24.
13+
*/
14+
public class TopKFrequentElementsTest {
15+
16+
TopKFrequentElements solution;
17+
18+
@Before
19+
public void setUp() {
20+
solution = new TopKFrequentElements.Solution2();
21+
}
22+
23+
@Test
24+
public void testSolution() {
25+
List<Integer> result = solution.topKFrequent(new int[]{1, 1, 1, 2, 2, 3}, 2);
26+
assertEquals(result, Lists.newArrayList(1, 2));
27+
}
28+
}

0 commit comments

Comments
 (0)