社区
数据结构与算法
帖子详情
百度笔试题请教!
rayeaster
2010-10-15 03:15:30
有一个无序的实数序列x1,x2.....xn,请设计个算法在
线性时间
内找到相邻(不是序列相邻,而是在实数轴上相邻)两点间最大距离??
感觉没有排序的话,怎么知道哪两点是相邻的呢?
...全文
328
8
打赏
收藏
百度笔试题请教!
有一个无序的实数序列x1,x2.....xn,请设计个算法在线性时间内找到相邻(不是序列相邻,而是在实数轴上相邻)两点间最大距离?? 感觉没有排序的话,怎么知道哪两点是相邻的呢?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
yongganhangxing
2011-10-07
打赏
举报
回复
//最大距离肯定大于平均距离,用桶装数
double max_gap(double* num, int n)
{
int i;
//找出最大最小值
double max=0.0,min = INT_MAX;
for(i=0;i<n;i++)
{
if(num[i]>max) max=num[i];
if(num[i]<min) min=num[i];
}
int *count=new int[n]; //动态分配,实际分到每个桶的数据个数
double *low=new double[n]; //实际分到每个桶的最小数据(下界)
double *high=new double[n]; //实际分到每个桶的最大数据(上界)
for(i = 0; i < n; i++) //初始化每个桶
{
count[i] = 0;
low[i] = max;
high[i] = min;
}
double ave=(max-min)/(n-1);
//按如下规则将num[i]分配到某个桶(编号doublemp)中
for(i=0;i < n; i++)
{
int temp=(int)((num[i]-min)/ave);
count[temp]++;
//调整分到该桶的最大最小数据
if(num[i] > high[temp])
high[temp] = num[i];
if(num[i] < low[temp])
low[temp] = num[i];
}
//寻找最大间隙
double left = high[0], res = 0.0;
for(i = 1;i < n; i++)
{
if(count[i]>0)
{
double temp = low[i]- left;
if(temp > res) res = temp;
left = high[i];
}
}
return res;
}
int main()
{
int num;
cin >> num;
double* pdArr = new double[num];
for (int i = 0; i < num; i++)
{
cin >> pdArr[i];
}
cout << max_gap(pdArr, num)<<endl;
return 0;
}
rayeaster
2010-10-15
打赏
举报
回复
[Quote=引用 6 楼 shayla 的回复:]
关键在于:距离平均值为(max-min)/n-1, 则距离最大的数必然大于这个值 这句话
假设有4个数,最小为0.2, 最大为0.8.
那么这四个数的平均距离为(0.8-0.2)/3 = 0.2
则必然存在两个数的差大于等于0.2,即距离最大的两个数必然不会小于0.2.
分成三个桶,分别是0.2~0.4, 0.4~0.6, 0.6~0.8.
那么距离最大的两个数必然不在同一个桶内……
[/Quote]
谢谢!明白了!
第一遍遍历,得到最大值最小值!
第二遍遍历,算出平均距离,分成n-1个桶,把每个数按照其与最小值的距离分别入桶
第三遍遍历桶,找出最终距离最大值~
shayla
2010-10-15
打赏
举报
回复
关键在于:距离平均值为(max-min)/n-1, 则距离最大的数必然大于这个值 这句话
假设有4个数,最小为0.2, 最大为0.8.
那么这四个数的平均距离为(0.8-0.2)/3 = 0.2
则必然存在两个数的差大于等于0.2,即距离最大的两个数必然不会小于0.2.
分成三个桶,分别是0.2~0.4, 0.4~0.6, 0.6~0.8.
那么距离最大的两个数必然不在同一个桶内.
依次比较上一个桶的最大值与下一个桶的最小值的差值,找最大的即可.
rayeaster
2010-10-15
打赏
举报
回复
[Quote=引用 4 楼 shayla 的回复:]
楼上方法可行, 距离平均值为(max-min)/n-1, 则距离最大的数必然大于这个值,
即不可能在各个桶内,各个桶也只要记住最小和最大的数即可,依次比较相邻桶的最大和
最小值的差.
[/Quote]
可否说得再详细一些?谢谢!
shayla
2010-10-15
打赏
举报
回复
楼上方法可行, 距离平均值为(max-min)/n-1, 则距离最大的数必然大于这个值,
即不可能在各个桶内,各个桶也只要记住最小和最大的数即可,依次比较相邻桶的最大和
最小值的差.
rayeaster
2010-10-15
打赏
举报
回复
[Quote=引用 1 楼 xero_123 的回复:]
利用桶,将(max-min)/n-1,个桶,然后距离最大的数,必定在相邻的桶中,O(N)的复杂度
[/Quote]
能不能说的详细点?是桶排序?
rayeaster
2010-10-15
打赏
举报
回复
实数序列,不是整数序列~
xero_123
2010-10-15
打赏
举报
回复
利用桶,将(max-min)/n-1,个桶,然后距离最大的数,必定在相邻的桶中,O(N)的复杂度
一道
百度
笔试题
的思考
前几天参加了
百度
的笔试, 就 AC 了一道题(留下菜鸡的泪水). 第三题没怎么花时间, 但是第二题是花了时间没做出来, 今天在牛客上学习了一下大佬们的代码, 居然还是没太明白(怀疑人生了). 就又去
请教
了东哥. 题目 输入两行数 : 第一行 : n (表示数组元素个数, 规模不大, 2 <= n <= 50 如果没记错的话) 第二行 : n 个数 (数值很大, 需要用 lon...
C/C++
笔试题
(很多)
微软亚洲技术中心的面试题!!! 1.进程和线程的差别。 线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别: (1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位 (2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行 (3)拥有资源:进程是拥有资源的独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源. (4)系
百度
笔试题
,求解答
转载于:http://blog.csdn.net/smarttony/article/details/1478600
百度
笔试题
,求解答 一、选择题:15分 共10题 1. 在排序方法中,关键码比较次数与记录地初始排列无关的是 . A. Shell排序 B. 归并排序 C. 直接插入排序 D. 选择排序 2. 以下
2022.4.19
百度
算法岗C++笔试
2022.4.19
百度
算法岗C++卷笔试
渗透测试
笔试题
主要讲解内容 [java]view plaincopy 1.什么是WebShell? 2.什么是网络钓鱼? 3.你获取网络安全知识途径有哪些? 4.什么是CC攻击? 5.Web服务器被入侵后,怎样进行排查? 6.dll文件是什么意思,有什么用?DLL劫持原理 7.0day漏洞 8.Rootkit是什么意思 9.蜜罐 10.ssh ...
数据结构与算法
33,027
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章