输入一个整数数组,返回所有元素两两之差绝对值最小的值,O(n)算法
2013-01-30 10:18
701 查看
输入一个整数数组,返回所有元素两两之差绝对值最小的值(只要得出最 小值即可,不需要求出是哪两个数)。
两两之差的绝对值的最小值,也就是在找所有元素中离得最近的两个元素的距离。
我有一个O(n)的算法,用空间换来的。方法如下:申请一个长度为UINT_MAX的bool型数组isExist[],初始值均为false。
第一阶段,遍历输入数组,并记录数组的最大值最小值对于ai,将isExist[ai]标记为true。标记过程中如果发现某元素已经出现,说明有重复元素,直接返回0,即是最小值。
第二阶段,遍历数组isExist[]中位于输入数组最小值和最大值之间的部分,则很容易找到最近距离。
第一阶段时间复杂度为O(N), 第二阶段最坏情况下时间复杂度为O(UINT_MAX),是个常数。所以,总的时间复杂度是O(N).
理论上讲是O(N)的,实际应用上因为第二阶段最坏要遍历UINT_MAX个元素,除非N非常大,否则还不如O(N*logN)的算法速度快。
不知是否合理,欢迎看到的人拍砖。
两两之差的绝对值的最小值,也就是在找所有元素中离得最近的两个元素的距离。
我有一个O(n)的算法,用空间换来的。方法如下:申请一个长度为UINT_MAX的bool型数组isExist[],初始值均为false。
第一阶段,遍历输入数组,并记录数组的最大值最小值对于ai,将isExist[ai]标记为true。标记过程中如果发现某元素已经出现,说明有重复元素,直接返回0,即是最小值。
第二阶段,遍历数组isExist[]中位于输入数组最小值和最大值之间的部分,则很容易找到最近距离。
第一阶段时间复杂度为O(N), 第二阶段最坏情况下时间复杂度为O(UINT_MAX),是个常数。所以,总的时间复杂度是O(N).
理论上讲是O(N)的,实际应用上因为第二阶段最坏要遍历UINT_MAX个元素,除非N非常大,否则还不如O(N*logN)的算法速度快。
不知是否合理,欢迎看到的人拍砖。
相关文章推荐
- 一道面试题:有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数。
- Comparator 实现集合中元素的比较.输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这321323
- 微软1 有一个整数数组,请求出两两之差绝对值最小的值
- 【1】 设一个长度为10的整型数组,  0)要求每个元素的值通过scanf输入,输入完成后,  1)请顺序输出这些整数,  2)请倒序输出这些整数,  3)输出这些数中的最大值,最小值
- 定义一个由整数组成的数组,然后输入一个整数X,如果X不在此数组中,返回小于X的最大数的位置i和大于X的最小数的位置j
- 给定一个有序整数数组,元素各不相同且按照升序排列,编写一个算法,创建一个高度最小的二叉查找树
- 问题:利用输入输出流重载实现一个整数数组的输入和输出。 要求:输入一个数组大小 及 所有元素的值,排序后输出该数组的所有元素。
- 有一个整数数组,请求出两两之差绝对值最小的值
- 有一个整数数组,请求出两两之差绝对值的最小值
- 有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数。
- 题目:给一个排序好的整数数组A,请写一个函数,输入是数组A和一个整数x,返回数组A中值小于x的最大元素的索引值
- 有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数。 (微软面试题)
- 有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数。
- 【算法】在整数数组求中出两两之差绝对值最小的值
- 【Java】给定一个有序整数数组,元素各不相同且按照升序排列,编写一个算法,创建一个高度最小的二叉查找树
- 将一个字典内的内value转换为集合:返回一个数组,此数组中包含输入字典的键值对中的数组的所有元素(为NSArray添加category)
- 算法--微软面试题:求一个整数数组元素间最小差值
- 整数数组的定义,然后输入一个整数X,假定X不在这个数组,返回小于X位置的最大数目i而超过X位置的最小数目j
- 数组中的数分为两组,让给出一个算法,使得两个组的和的差的绝对值最小,数组中的数的取值范围是0<x<100,元素个数也是大于0, 小于100 。
- 算法题: 求一个整数数组中,通过元素加减运算得到指定结果的所有运算过程. 例如【5,4,6,7,1】= 9 ?