没有合适的资源?快使用搜索试试~ 我知道了~
十年大厂Java笔试面试题及答案
需积分: 50 7 下载量 187 浏览量
2021-03-12
20:48:33
上传
评论
收藏 31KB DOCX 举报
温馨提示
试读
15页
适合Java开发面试
资源详情
资源评论
资源推荐
个降序数组,找到最大的 个数
(版)
假定有 个有序数组,每个数组有 个数字,降序排列,数字类型 位 数值,
现在需要取出这 个数字中最大的 个,怎么做?
解决方法
这里其实有很多解决方法,笨拙的或者巧妙的。这里介绍一个非常不错的方法,使用最大
堆堆排序:
建立大顶堆,维度为数组的个数,这里为 (第一次 插入的是每个数组中最大的值,
即第一个元素)。
删除最大堆堆顶,保存到数组或者栈中,然后向最大堆插入删除的元素所在数组的下一
个元素。
重复第 个步骤,直到删除个数为最大的 个数,这里为
代码:
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <functional>
using namespace std;
#define ROWS 20
#define COLS 500
int data[ROWS][COLS];
void CreateData()
{
for(int i=0; i<ROWS; i++)
{ for(int j=0; j<COLS;j++)
{
data[i][j] = rand(); //生成随机元素
}
}
for( int i=0; i<ROWS; i++)
sort(data[i],data[i]+COLS, greater<int>()); //对每一行降序排列
}
struct Node
{
int *p; //指向某个列,因为要放入优先队列中,所以要比较大小,就用结构体
封装了下 bool operator<(const struct Node &node) const
{
return *p < *node.p;
}
};
void OutMinData( int k) {
struct Node arr[ROWS];
for(int i=0; i<ROWS;i++)
{
arr[i].p = data[i]; //初始化指针指向各行的首位
}
priority_queue<Node > queue( arr, arr+ROWS ); //使用优先队列,默
认是大堆
for( int i=0; i<k&&i<COLS; i++) //算法核心就是这个循环
{
Node temp = queue.top(); //取出队列中最大的元素
cout << *temp.p << " " <<endl; queue.pop(); //从队列里删除
temp.p++; //对应行的指针后移
queue.push( temp ); //这里面有 log(ROWS)次操作,所以算法的总复
杂度为 O(klog(20))
}
}
int main()
{
CreateData(); //生成数据
int k=500;
OutMinData( k ); //输出 k 个元素,这里 k 不要大于列数 COL,可以改进,去
掉这个限制,不过会让程序不好懂,就没加
return 0;
}
寻找数组中第 大的数
1)方法一:堆排序找第 k 大的数,先构建大根堆,求第 k 大的数,就调整 k 次,
然后输出 arr[len-k]位置的数
!""#$%&
'()""#$*
""#$)""#$*
""#$)'(*
+
,,构建大根堆并调整 次
-'."!#$""%&
/"!)""'0-,1*2)*11%&
!""""'0-%*
+
/"!)*3*%&
!""""'0-11%*
!""""'0-11%*
+
.4'("!""#""'0-1$%*
+
!#$""'%&
'()""#$*
/"!)5*3'*)5%&
/!""#$3""#$663'%&
*
+
/!""#$2'(%&
""#$)""#$*
)*
+''&
"'*
+
+
""#$)'(*
+
(!."0#$"0%&
#$"")' #$&789:+*
)*,,找第 大的数
-'."!""%*
,,输出为 9
+
2)方法二、快速排序思想,先找数组第 k 大的数,当执行一次 partition 函数
找到 index 下标时,index 左边的数比 arr[index]大,右边的数比 arr[index]小
'&
,,第 小,快速排序寻找一次数字正确位置的下标
"!#$"" -0-%&
'()""#
-'! 3-0-%&
-'! 3-0-66""#-0-$2'(%&
-0-11*
+
""# $)""#-0-$*
-'! 3-0-66""# $3'(%&
*
+
""#-0-$)""# $*
剩余14页未读,继续阅读
CYL_TING
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 软件仿真多机串行通信.doc
- Python大作业:音乐播放软件(爬虫+可视化+数据分析+数据库)
- 课程设计-python爬虫-爬取日报,爬取日报文章后存储到本地,附带源代码+课程设计报告
- 软件和信息技术服务行业投资与前景预测.pptx
- 课程设计-基于SpringBoot + Mybatis+python爬虫NBA球员数据爬取可视化+源代码+文档+sql+效果图
- 软件品质管理系列二项目策划规范.doc
- 基于TensorFlow+PyQt+GUI的酒店评论情感分析,支持分析本地数据文件和网络爬取数据分析+源代码+文档说明+安装教程
- 软件定义无线电中的模拟电路测试技术.pptx
- 软件开发协议(作为技术开发合同附件).doc
- 软件开发和咨询行业技术趋势分析.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0