BAT面试题 - 找一个无序实数数组中的最大差值
题目描写叙述:
解题思路
- 扫面一遍数组。找到数组中的最大max,最小min值。
- 将[min, max]区间平均分为n-1个区间段(每一个区间段相应一个桶bucket),每一个桶用一对有序实数对[a,b] 来表示桶内的数。
- 再次从头到尾扫描数组,将每一个元素加入到对应的桶bucket里面。
注意:有的桶为空(不含不论什么数据)
- 然后按顺序訪问每一个(非空)的相邻的桶进行比較。
若两个非空的相邻的桶分别为(a,b) , (c,d),那么这两个非空相邻的桶的距离为 c-b。最后选择最大的非空相邻同的距离返回就可以。
- 上述算法是空间和时间复杂度均是O(n)
- 我们不须要计算桶内元素的距离(如b-a)。由于数组最大间隔max-min分成n-1个桶。n个元素中一定有两个相邻元素的距离大于桶内的距离(想一想抽屉原理或者鸽巢原理),所以桶内的距离是不用算的
源码:C++
#include <iostream>#include <vector>#include <utility>using namespace std;/**一个无序的实数数组,求它们近期邻的两个值的差**/double maxDiff(double a[], int n){double max = a[0];double min = a[0];for (int i=1; i<n; ++i){if (max < a[i]){max = a[i];}if (min > a[i]){min = a[i];}}double bar = (max - min)/(n-1);int pos;//pair<first,second> : first表示桶的左边界index。second表示桶的右边界indexvector< pair<int,int> > buckets(n,make_pair(-1,-1));//这里桶内存对应数据的下标,而不是对应的数据,方便后面的数据计算,以免有精度损失。for (int i=0; i<n; i++){pos = (int)((a[i] - min)/bar);if ((buckets[pos].first == -1) && (buckets[pos].second == -1)){ //下标比較,若为double型比較注意精度问题buckets[pos].first = buckets[pos].second = i;}else{if (a[buckets[pos].first] > a[i])buckets[pos].first = i;if (a[buckets[pos].second] < a[i])buckets[pos].second = i;}}int lastIx=0;double max_diff = 0;double tmp_diff = 0;for (int i=1; i<n; ++i){ //计算桶之间的距离if ((buckets[i].first == -1) && (buckets[i].second == -1)){//桶为空的标志,不处理}else{tmp_diff = a[buckets[i].first] - a[buckets[lastIx].second];if (tmp_diff > max_diff){max_diff = tmp_diff;}lastIx = i;//lastIx指上一个非空桶的index。且第一个桶和最后一个桶肯定非空。}}return max_diff;}int main(){double a[]={2,4,8,16,19.0,7,7,30};cout<<maxDiff(a,8)<<endl;return 0;}
BAT面试题 - 找一个无序实数数组中的最大差值的更多相关文章
- C#编写程序,找一找一个二维数组中的鞍点
编写程序,找一找一个二维数组中的鞍点(即该位置上的元素值在行中最大,在该列上最小.有可能数组没有鞍点).要求: 1.二维数组的大小.数组元素的值在运行时输入: 2.程序有友好的提示信息. 代码: us ...
- LeetCode 128 Longest Consecutive Sequence 一个无序整数数组中找到最长连续序列
Given an unsorted array of integers, find the length of the longest consecutive elements sequence.Fo ...
- 128 Longest Consecutive Sequence 一个无序整数数组中找到最长连续序列
给定一个未排序的整数数组,找出最长连续序列的长度.例如,给出 [100, 4, 200, 1, 3, 2],这个最长的连续序列是 [1, 2, 3, 4].返回所求长度: 4.要求你的算法复杂度为 O ...
- 624. Maximum Distance in Arrays二重数组中的最大差值距离
[抄题]: Given m arrays, and each array is sorted in ascending order. Now you can pick up two integers ...
- [原]Java面试题-输入一个整型数组,找出最大值、最小值,并交换。
[Date]2013-09-19 [Author]wintys (wintys@gmail.com) http://wintys.cnblogs.com [Content]: 1.面试题 输入一个整型 ...
- [LeetCode]面试题53 - I. 在排序数组中查找数字 I(二分);面试题53 - II. 0~n-1中缺失的数字(二分)
##面试题53 - I. 在排序数组中查找数字 I ###题目 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 ...
- 《剑指offer》面试题3:二维数组中的查找
面试题3:二维数组中的查找 面试题3:二维数组中的查找题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的个二维数组和一个整数,判 ...
- FCC JS基础算法题(5):Return Largest Numbers in Arrays(找出多个数组中的最大数)
题目描述: 找出多个数组中的最大数右边大数组中包含了4个小数组,分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新数组.提示:你可以用for循环来迭代数组,并通过arr[i]的方式来访问数组 ...
- 剑指offer——面试题4:二维数组中的查找
// 面试题4:二维数组中的查找 // 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按 // 照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个 // 整数 ...
随机推荐
- Java基础String的方法
Java基础String的方法 字符串类型写法格式如下: 格式一: String 变量名称; 变量名称=赋值(自定义或传入的变量值); 格式二: String 变量名称=赋值(自定义或传入的变量值); ...
- OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaDa
元数据最本质.最抽象的定义为:data about data (关于数据的数据).它是一种广泛存在的现象,在许多领域有其具体的定义和应用. JDBC中的元数据,有数据库元数据(DatabaseMeta ...
- 【VC++学习笔记一】MFC操作Excel
最近在做一个读取Excel的功能,之前也做过相关的,但总是零零闪闪的,趁着正在劲头上,归纳一下: 利用Automation添加相关的类,在Excel2010中可以在安装文件夹下直接点击Excel.ex ...
- IT运维分析
http://www.infoq.com/cn/presentations/case-of-it-operation-analysis-and-log-search-analysis-engine?u ...
- 为SSD编程(4)——高级功能和内部并行
原文 http://codecapsule.com/2014/02/12/coding-for-ssds-part-4-advanced-functionalities-and-internal-pa ...
- 创建maven项目pom.xml出现错误(依赖Missing)
Maven的依赖问题 在聚合模块时候,发现在父工程目录中的依赖存在一些问题.一开始是${pagehelper.version},后来将版本直接填写相应的版本如图下 依赖添加失败 * 在父工程的jar包 ...
- javafx checkbox
public class EffectTest extends Application { public static void main(String[] args) { launch(args); ...
- POJ——T 2891 Strange Way to Express Integers
http://poj.org/problem?id=2891 Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 16849 ...
- cocos2dx——lua自己主动和手动绑定
[自己主动绑定] 參考:http://my.oschina.net/skyhacker2/blog/298397 主要是通过引擎自带的tools/tolua,主要过程例如以下: 1.编写好要导出的c+ ...
- [Redux-Observable && Unit testing] Testing the output of epics
Epics can be unit-tested just like any other function in your application - they have a very specifi ...