阿里巴巴面试算法题目:有无序的实数列V[N],要求求里面大小相邻的实数的差的最大值,关键是要求线性空间和线性时间
2013-08-03 17:59
543 查看
阿里巴巴面试算法题目:有无序的实数列V
,要求求里面大小相邻的实数的差的最大值,关键是要求线性空间和线性时间
分类: 微软、谷歌、百度等公司经典面试100题_20112012-09-2613:38 1589人阅读 评论(0) 收藏 举报
阿里巴巴面试算法deletec
from: /article/8615688.html
题目:有无序的实数列V
,要求求里面大小相邻的实数的差的最大值,关键是要求线性空间和线性时间
用基于桶排序的方式。
注意到,最后只需要求间隔的最大值,所以任何间隔小于bar= (max - min)/(N-1) 的值都可以不计。
这样,首先求随机数组中的max , min 这些都是线性时间的
然后,分配从[min, max]间分配(N-1)个桶,每个桶是一个有序实数对,(a,b)
将所有数往桶里塞,把欲塞进去的数记为x,如果桶里本身没有数,那么a=b=x
如果x>b,那么b=x,如果x <a那么a=x,反正就是说这个桶里的(a,b)表示进入该桶中的数的范围。此操作是线性的。
然后按顺序对每个相邻桶(跳过没有数的桶)进行比较。例如,相邻桶(a,b), (c,d)的距离D = 就是c - b
最终就是,比较的D的最大值。这时间也是线性的。空间也是线性的。
可能的问题:为什么我不必计算(b-a)或者(d-c)呢?很显然,b-a和d-c都是 <bar的,最大相邻间隔肯定是大于bar的。
代码:
#include <stdio.h>
int MaxDiff(int a[], int n)
{
int max, min, i;
max = min = a[0];
for (i=1; i < n; ++i)
{
if (a[i] > max)
max = a[i];
if (a[i] < min)
min = a[i];
}
int bar, pos;
bar = (max-min)/(n-1);
int (*bucket)[2] = new int
[2](); //初始化数组 [0]放桶中最小 [1]放桶中最大值
memset(bucket, 0, n*2*sizeof(int));
for (i=0; i<n; ++i)
{
pos = (a[i]-min)/bar;
if (bucket[pos][0] == 0)
{
bucket[pos][0] = bucket[pos][1] = a[i];
}
else
{
if (a[i] > bucket[pos][1])
bucket[pos][1] = a[i];
if (a[i] < bucket[pos][0])
bucket[pos][0] = a[i];
}
}
int max_diff, diff;
max_diff = 0;
for (i=1; i<n; ++i)
{
if (bucket[i][0] != 0)
{
diff = bucket[i][0] - bucket[i-1][1];
if (max_diff < diff)
max_diff = diff;
}
}
delete[] bucket;
return max_diff;
}
int main()
{
int b[] = {3, 89, 76, 23, 23, 87};
printf("%d", MaxDiff(b, 4));
return 0;
}
相关文章推荐
- 阿里巴巴面试算法题目:有无序的实数列V[N],要求求里面大小相邻的实数的差的最大值,关键是要求线性空间和线性时间
- 阿里巴巴面试算法题目:有无序的实数列V[N],要求求里面大小相邻的实数的差的最大值,关键是要求线性空间和线性时间
- 有无序的实数列V[N],要求求里面大小相邻的实数的差的最大值,关键是要求线性空间和线性时间。
- 有无序的实数列V[N],要求求里面大小相邻的实数的差的最大值,关键是要求线性空间和线性时间。
- 有无序的实数列 V[N],要求求里面大小相邻的实数的差的最大值,关键是要求线性空 间和线性时间
- 在线性时间和空间复杂度内,求大小相邻两元素之差的最大值
- 最大间隙问题。给定 n 个实数,求这n个实数在数轴上相邻2个数之间的最大差值,设计解最大间隙问题的线性时间算法。
- 最大间隙问题。给定 n 个实数,求这n个实数在数轴上相邻2个数之间的最大差值,设计解最大间隙问题的线性时间算法。
- 大数据面试题求解:给定n个实数 ,求着n个实数在实轴上向量2个数之间的最大差值,要求线性的时间算法(最大间隙问题)
- 数据结构与算法——有1亿个整数,找出最大的1000个,要求时间越短越好,空间占用越少越好
- 谷歌面试题--一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素,要求O(1)空间和O(n)时间
- 阿里巴巴面试算法题:有一个函数int getNum(),每运行一次可以从一个数组V[N]里面取出一个数,N未知,当数取完的时候,函数返回NULL。现在要求写一个函数int get(),这个函数运行一次可以从V[N]里随机取出一个数,而这个数必须是符合1/N
- 长度为n的整数数组,找出其中任意(n-1)个乘积最大的那一组,只能用乘法,不可 以用除法。要求对算法的时间复杂度和空间复杂度作出分析,可以写思路也可以写程序。
- 编写一个PHP函数。求任意n个正负整数里面最大的连续和,要求算法时间复杂度尽可能低。
- 一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素,要求O(1)空间和O(n)时间。
- 被面试到的一则算法题目: 无序列数组里面,求最长的连续数的长度
- 算法-无序数列最大相邻大小差值
- 编写一个PHP函数。求任意n个正负整数里面最大的连续和,要求算法时间复杂度尽可能低
- 【表空间支持的最大数据文件大小的算法】【数据库限制】【数据文件文件头保留数据块数】
- 《数据结构》2.10设计一个算法,删除顺序表中值为item的元素,要求算法的时间复杂度是O(n),空间复杂度是O(1)