社区
数据结构与算法
帖子详情
百度笔试题请教!
rayeaster
2010-10-15 03:15:30
有一个无序的实数序列x1,x2.....xn,请设计个算法在
线性时间
内找到相邻(不是序列相邻,而是在实数轴上相邻)两点间最大距离??
感觉没有排序的话,怎么知道哪两点是相邻的呢?
...全文
252
8
打赏
收藏
百度笔试题请教!
有一个无序的实数序列x1,x2.....xn,请设计个算法在线性时间内找到相邻(不是序列相邻,而是在实数轴上相邻)两点间最大距离?? 感觉没有排序的话,怎么知道哪两点是相邻的呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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...
百度
笔试题
,求解答
转载于: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++卷笔试
C/C++
笔试题
微软亚洲技术中心的面试题!!! 1.进程和线程的差别。 线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别: (1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位 (2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行 (3)拥有资源:进程是拥有资源的独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源. (4
c/c++
笔试题
微软亚洲技术中心的面试题!!! 1.进程和线程的差别。 线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别: (1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位 (2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行 (3)拥有资源:进程是拥有资源的独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源. (4
数据结构与算法
33,007
社区成员
35,326
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章