剑指Offer——最小的K个数
题目描述:
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。
分析:
建一个K大小的大根堆,存储最小的k个数字。
先将K个数进堆,然后调整堆为大根堆。
之后每加一个数,就和堆的根结点比较。
如果大于堆的根结点,则忽略。否则,替换根结点的值,然后调整堆。
最后,剩下的就是其中最小的K个数。
代码:
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
int iSize = input.size();
if(k == iSize) return input;
vector<int> leastNumbers;
if(k <= || k > iSize) return leastNumbers;
leastNumbers.push_back(); // 使下标为0的位置为0,不使用该位置,便于访问后面的元素
for(int i = ; i < k; i++) { // 初始化一个k大小的堆
leastNumbers.push_back(input[i]);
}
for(int i = k / ; i > ; --i) {
HeapAdjust(leastNumbers, i, k); // 调整为大根堆
}
for(int i = k; i < iSize; i++) {
if(input[i] < leastNumbers[]) {
leastNumbers[] = input[i];
HeapAdjust(leastNumbers, , k); // 调整为大根堆
}
}
leastNumbers.erase(leastNumbers.begin()); // 移除第0位置的0
return leastNumbers;
}
void HeapAdjust(vector<int> &input, int s, int m) { // 调整堆
int rc = input[s];
for(int j = (s << ); j <= m; j <<= ) {
if(j < m && input[j] < input[j + ]) ++j;
if(rc > input[j]) break;
input[s] = input[j];
s = j;
}
input[s] = rc;
}
};
剑指Offer——最小的K个数的更多相关文章
- 剑指offer 最小的k个数 、 leetcode 215. Kth Largest Element in an Array 、295. Find Median from Data Stream(剑指 数据流中位数)
注意multiset的一个bug: multiset带一个参数的erase函数原型有两种.一是传递一个元素值,如上面例子代码中,这时候删除的是集合中所有值等于输入值的元素,并且返回删除的元素个数:另外 ...
- python剑指offer最小的K个数
题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 思路: 使用快排中的partition思想. ①我们设定part ...
- 用js刷剑指offer(最小的K个数)
题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 牛客网链接 js代码 function GetLeastNumbe ...
- 剑指 Offer——最小的 K 个数
1. 题目 2. 解答 2.1. 方法一--大顶堆 参考 堆和堆排序 以及 堆的应用,我们将数组的前 K 个位置当作一个大顶堆. 首先建堆,也即对堆中 [0, (K-2)/2] 的节点从上往下进行堆化 ...
- 剑指offer--10.最小的K个数
边界判断,坑了一下 ----------------------------------------------- 时间限制:1秒 空间限制:32768K 热度指数:375643 本题知识点: 数组 ...
- 剑指Offer-29.最小的K个数(C++/Java)
题目: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 分析: 最先想到的是将数组升序排列,返回前k个元素.不过排序的话效率 ...
- 剑指:最小的k个数
题目描述 输入 n 个整数,找出其中最小的 K 个数.例如输入 4,5,1,6,2,7,3,8 这 8 个数字,则最小的 4 个数字是 1,2,3,4. 解法 解法一 利用快排中的 partition ...
- 2-剑指offer: 最小的K个数
题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 代码: // 这种topN问题比较常见的是使用堆来解决,最小的k个 ...
- 剑指Offer28 最小的K个数(Partition函数应用+大顶堆)
包含了Partition函数的多种用法 以及大顶堆操作 /*********************************************************************** ...
随机推荐
- std::string与output-operator"<<"的兼容问题
经查阅资料得知,“在某些编译器下std::string,需要使用c_str()才能作为output-operator "<<" 的参数” std::string tit ...
- 关于Unity中场景视图的使用
1.在任何状态下,按下鼠标中键可以切换到手掌的那个状态,可以移动当前场景 2.在手掌的那个状态,按住鼠标左键是移动场景视图,右键是视角绕着摄像机移动,按住alt+鼠标左键,是绕着指定物体旋转视角 3. ...
- Class中isAssignableFrom() 方法
看Spring源码的时候看到这个方法: protected WebApplicationContext createWebApplicationContext(ServletContext sc) { ...
- linux -- Ubuntu修改静态IP地址重启后无法上网的解决
ubuntu设置静态IP地址后,上不了网 文章中也提到,如果是在/etc/resolv.conf添加DNS,由于Ubuntu 有一个 resolvconf 服务,如果重启它,那么 /etc/resol ...
- 用户控件(ASCX)向网页(ASPX)传值使用反射实现
用户控件向网页传递值,方法非常之多,此博文尝试使用反射来实现.在站点中,建一个网页以及一个用户控件. 网页切换至设计模式,拉用户控件至网页上. Default.aspx: <%@ Page La ...
- .NET基础知识(一、认识.Net)
参考链接:http://blog.csdn.net/shanyongxu/article/details/50849111 认识.NET平台 可能很多人问什么是.NET框架,它包含了哪些内容?为开发程 ...
- 第六篇:二维数组的传输 (host <-> device)
前言 本文的目的很明确:介绍如何将二维数组传递进显存,以及如何将二维数组从显存传递回主机端. 实现步骤 1. 在显存中为二维数组开辟空间 2. 获取该二维数组在显存中的 pitch 值 (cudaMa ...
- 判断uiscrollView滑到底部
本文转载至 http://blog.csdn.net/cerastes/article/details/39612177 -(void)scrollViewDidScroll:(UIScrollVi ...
- IOS7开发~新UI学起(三)
1.UITextView: A ) IOS7新增加的 UITextViewDelegate 方法: - (BOOL)textView:(UITextView *)textView shoul ...
- tomcat下载与安装..使用和配置环境变量
操作环境: xp, myEclipse6.5 tomcat6.0 正文: 一.下载 tomcat官方网站 http://tomcat.apache.org 在左边Download树形菜单中 点击最新版 ...