剑指Offer28 最小的K个数(Partition函数应用+大顶堆)
包含了Partition函数的多种用法
以及大顶堆操作
/*************************************************************************
> File Name: 28_KLeastNumbers.cpp
> Author: Juntaran
> Mail: JuntaranMail@gmail.com
> Created Time: 2016年08月31日 星期三 19时45分41秒
************************************************************************/ #include <stdio.h>
#include <bits/stdc++.h> using namespace std; // 大顶堆求最小K个数
typedef multiset<int, greater<int> > intSet;
typedef multiset<int, greater<int> >::iterator setIterator; void GetKLeastNumbers2(int* data, intSet& leastNumbers, int length, int k)
{
leastNumbers.clear(); if (k< || length<k)
return; for (int i = ; i < length; ++i)
{
if (leastNumbers.size() < k)
leastNumbers.insert(data[i]); else
{
setIterator Greatest = leastNumbers.begin();
if (data[i] < *(leastNumbers.begin()))
{
leastNumbers.erase(Greatest);
leastNumbers.insert(data[i]);
}
}
} for (setIterator iter = leastNumbers.begin(); iter != leastNumbers.end(); ++iter)
{
printf("%d ", *iter);
}
printf("\n");
} void swap(int* p, int* q)
{
int temp = *p;
*p = *q;
*q = temp;
} // Partition函数应用
int Partition(int* data, int length, int start, int end)
{
if (data==NULL || length<= || start< || end>=length)
return -; // 令数组第一个数字为标杆
int index = start; // 标杆与数组最后一个元素交换
swap(&data[index], &data[end]); int small = start - ;
for (index = start; index < end; ++index)
{
if (data[index] < data[end])
{
++ small;
if (small != index)
{
swap(&data[index], &data[small]);
}
}
}
++ small;
swap(&data[small], &data[end]); return small;
} // 利用Partiton实现快排
void quickSort(int* data, int length, int start, int end)
{
if (start==end || data==NULL || length<=)
return; int index = Partition(data, length, start, end);
// printf("index is %d\n", index);
if (index > start)
quickSort(data, length, start, index-);
if (index < end)
quickSort(data, length, index+, end);
} // 利用Partition寻找出现次数超过一半的数 (中位数)
int GetMoreThanHalf(int* input, int length)
{
if (input==NULL || length<=)
return -;
int start = ;
int end = length - ;
int index = Partition(input, length, start, end);
int middle = length >> ;
while (index != middle)
{
if (index > middle)
{
end = index - ;
index = Partition(input, length, start, end);
}
else
{
start = index + ;
index = Partition(input, length, start, end);
}
}
int ret = input[middle];
// 检验是否正确
int count2 = ;
for (int i = ; i < length; ++i)
{
if (input[i] == ret)
count2 ++;
}
if (count2* > length)
{
printf("middle number is %d\n", input[middle]);
return ret;
}
else
{
printf("Not Find\n");
return -;
}
} // 利用Partition寻找第K小的数
int GetKthNumber(int* input, int length, int k)
{
if (input==NULL || length<= || k<= || k>length)
return -;
int start = ;
int end = length - ;
int index = Partition(input, length, start, end);
while (index != k - )
{
if (index > k-)
{
end = index-;
index = Partition(input, length, start, end);
}
else
{
start = index + ;
index = Partition(input, length, start, end);
}
}
printf("Kth is %d\n", input[index]);
return input[index];
} // 利用Partition寻找最小K个数
void GetKLeastNumbers(int* input, int length, int* output, int k)
{
if (input==NULL || output==NULL || length<= || k<= || k>length)
{
return;
}
int start = ;
int end = length - ;
int index = Partition(input, length, start, end);
while (index != k - )
{
if (index > k-)
{
end = index - ;
index = Partition(input, length, start, end);
}
else
{
start = index + ;
index = Partition(input, length, start, end);
}
// printf("index is %d\n", index);
}
for (int i = ; i < k; ++i)
output[i] = input[i]; for (int i = ; i < k; ++i)
printf("%d ", output[i]);
printf("\n");
} int main()
{
int k = ;
int nums[] = {,,,,,,,,,};
int length = ;
int output[k] = {}; // 快速排序
quickSort(nums, length, , length-);
for (int i = ; i < length; ++i)
printf("%d ", nums[i]);
printf("\n"); // 求最小K个数
GetKLeastNumbers(nums, length, output, k); // 求第K大的数
GetKthNumber(nums, length, k); // 求数组中超过一半的数(中位数)
GetMoreThanHalf(nums, length); // 大顶堆求最小K个数
intSet leastNumbers;
GetKLeastNumbers2(nums, leastNumbers, length, k);
}
剑指Offer28 最小的K个数(Partition函数应用+大顶堆)的更多相关文章
- 剑指offer 最小的k个数 、 leetcode 215. Kth Largest Element in an Array 、295. Find Median from Data Stream(剑指 数据流中位数)
注意multiset的一个bug: multiset带一个参数的erase函数原型有两种.一是传递一个元素值,如上面例子代码中,这时候删除的是集合中所有值等于输入值的元素,并且返回删除的元素个数:另外 ...
- 剑指 Offer——最小的 K 个数
1. 题目 2. 解答 2.1. 方法一--大顶堆 参考 堆和堆排序 以及 堆的应用,我们将数组的前 K 个位置当作一个大顶堆. 首先建堆,也即对堆中 [0, (K-2)/2] 的节点从上往下进行堆化 ...
- python剑指offer最小的K个数
题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 思路: 使用快排中的partition思想. ①我们设定part ...
- 剑指:最小的k个数
题目描述 输入 n 个整数,找出其中最小的 K 个数.例如输入 4,5,1,6,2,7,3,8 这 8 个数字,则最小的 4 个数字是 1,2,3,4. 解法 解法一 利用快排中的 partition ...
- 剑指Offer——最小的K个数
题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 分析: 建一个K大小的大根堆,存储最小的k个数字. 先将K个数进堆 ...
- 剑指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个元素.不过排序的话效率 ...
- 用js刷剑指offer(最小的K个数)
题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 牛客网链接 js代码 function GetLeastNumbe ...
- 2-剑指offer: 最小的K个数
题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 代码: // 这种topN问题比较常见的是使用堆来解决,最小的k个 ...
随机推荐
- linux TCP数据包重传过程----小结
于TCP/IP协议栈的TCP协议的重传功能是由在linux内核源码(net/ipv4/tcp_output.c)中的函数tcp_retransmit_skb()实现的 代码如下: /* This re ...
- java(2014版)连接数据库的工具类
package util; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; ...
- 记一次PHP项目部署过程
首先介绍一下项目的基本情况:使用PHP语言开发,数据库用的是MySQL 5.5,HTTP服务器用的是Apache 2.2.早上十点到机房看了看服务器的基本情况:Windows 2000操作系统,没有安 ...
- 浏览器判断及IE版本区分
备注:在火狐下和IE下,js的执行不一致,很多语句结果不一致,其他浏览器也可能,注意验证,多用if else包括window.onload: ①只用来区分IE和非IE内核的浏览器,由于只有IE支持Ac ...
- installshield basic msi 更新时覆盖不了上一个版本文件解决方案1
1.增加dll exe程序集的版本号 2.设置IS里文件的Set key file
- ref和out的使用与区别
out的使用 ————————————————————————————————————————————————— class Program { static void Main( ...
- 【转】android出现注: 某些输入文件使用或覆盖了已过时的 API。 注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。 注: 某些输入文件使用了未经检查或不安全的操作。 注
使用Android studio打包应用程序出现如下错误: 注: 某些输入文件使用或覆盖了已过时的 API. 注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译. 注: 某些 ...
- .Net连接到SAP【转载】
刚开始接触SAP了,感觉很陌生,清一色的TCode,不过里面的功能确实强大,不得不佩服啊,之前我一直是搞WinForm和WebForm的,现在能够接触到SAP那我还是想多学习一下,看了一下ABAP的语 ...
- phpexcel来做表格导出(多个工作sheet)
1.先得去下载phpexcel文档,加压下来 <?php /** * 简单实用Execl */ set_include_path('.'.get_include_path().PATH_SEPA ...
- 今天弱爆了,svn创建项目
今天弱爆了 1.再svnRoot下新建你要建的项目名如:hqdj 文件夹,然后选中它点击右键选中create repository here... ,选择文件系统类型 2.进入conf文件夹进行配置 ...