LeetCode Top K Frequent Elements
2016-06-04 10:06
471 查看
题意:给出一个数组,求出前k个出现频率最多的数
思路:首先统计每个元素的次数(用Map),然后用堆排序只统计前k个(PriorityQueue)
代码如下:
class Solution
{
class Pair implements Comparable<Pair>
{
int key, value;
public int compareTo(Pair b)
{
return value - b.value;
}
}
public List<Integer> topKFrequent(int[] nums, int k)
{
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < nums.length; i++)
{
if (map.containsKey(nums[i]))
{
map.put(nums[i], map.get(nums[i]) + 1);
}
else
{
map.put(nums[i], 1);
}
}
Comparator<Pair> cmp = new Comparator<Pair>()
{
public int compare(Pair a, Pair b)
{
return a.value - b.value;
}
};
Queue<Pair> queue = new PriorityQueue<Pair>(k, cmp);
for(Map.Entry<Integer, Integer> ele: map.entrySet())
{
Pair p = new Pair();
p.key = ele.getKey(); p.value = ele.getValue();
if (queue.size() < k)
{
queue.add(p);
}
else
{
if (p.compareTo(queue.peek()) > 0)
{
queue.poll();
queue.offer(p);
}
}
}
List<Integer> res = new ArrayList<Integer>();
while (!queue.isEmpty())
{
Pair p = queue.poll();
res.add(p.key);
}
Collections.sort(res);
return res;
}
}
思路:首先统计每个元素的次数(用Map),然后用堆排序只统计前k个(PriorityQueue)
代码如下:
class Solution
{
class Pair implements Comparable<Pair>
{
int key, value;
public int compareTo(Pair b)
{
return value - b.value;
}
}
public List<Integer> topKFrequent(int[] nums, int k)
{
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < nums.length; i++)
{
if (map.containsKey(nums[i]))
{
map.put(nums[i], map.get(nums[i]) + 1);
}
else
{
map.put(nums[i], 1);
}
}
Comparator<Pair> cmp = new Comparator<Pair>()
{
public int compare(Pair a, Pair b)
{
return a.value - b.value;
}
};
Queue<Pair> queue = new PriorityQueue<Pair>(k, cmp);
for(Map.Entry<Integer, Integer> ele: map.entrySet())
{
Pair p = new Pair();
p.key = ele.getKey(); p.value = ele.getValue();
if (queue.size() < k)
{
queue.add(p);
}
else
{
if (p.compareTo(queue.peek()) > 0)
{
queue.poll();
queue.offer(p);
}
}
}
List<Integer> res = new ArrayList<Integer>();
while (!queue.isEmpty())
{
Pair p = queue.poll();
res.add(p.key);
}
Collections.sort(res);
return res;
}
}
相关文章推荐
- Android View 深度分析requestLayout、invalidate与postInvalidate
- UGUI射线穿透UI
- uva 1608 Non-boring sequences
- STL-priority_queue用法(重点: 升序,小根堆)
- TreeBuilder科学的树创建器
- Android总结Handler异步更新UI界面
- GUI中的事件绑定
- 特殊权限SUID等详解
- SPOJ DQUUERY (在线主席树 | 离线树状数组)
- EasyUI布局 高度自适应
- testNg+ant+jenkins之ant配置build.xml
- EasyUI datebox 日期选择范围
- 左式堆 斜堆 buildHeap
- Android UI 之居中绘制文本内容的正确方法——实现自定义一个TextView
- iOS开发学习笔记-UIScrollView的用法
- GUI图形用户接口的基本使用
- windows平台时间函数性能比较QueryPerformanceCounter,GetTickCount,ftime,time,GetLocalTime,GetSystemTimeAsFileTim
- UESTC 491 Tricks in Bits (暴力回溯 + 剪枝)
- trickyPriorityQueue
- iOS开发——搜索框(UISearchController)