一个整数数组,返回所有元素两两之差绝对值最小的值 O(n)复杂度

kingbird_Wang 2013-01-30 10:43:25
一个很古老题目,今天翻出来想了想。
两两之差的绝对值的最小值,也就是在找所有元素中离得最近的两个元素的距离。

我有一个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)的还是很牵强。高手们给看看呗。
...全文
924 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jingyyy646 2013-03-09
  • 打赏
  • 举报
回复
第一步相当于计数排序吧,如果用快排的话就变成nlogn了,主要看原数组满不满足计数排序的条件。
FancyMouse 2013-01-31
  • 打赏
  • 举报
回复
你这个n不是数据长度,是值域大小……所以根本不是O(n)。
绿色夹克衫 2013-01-30
  • 打赏
  • 举报
回复
这题好像没有O(n)的方法,不过n*log(n)的方法就有一大堆了
cnmhx 2013-01-30
  • 打赏
  • 举报
回复
这是不可能的。 基于直接比较的算法,总是n^2复杂度的;能优化到nlogn就是最好的了。
第一篇 面试题 ................................................................................ 8 1.1. 简介 ............................................................................................................... 8 1.2. 面试题集合(一) .......................................................................................... 8 1.2.1. 把二元查找树转变成排序的双向链表.................................................... 8 1.2.2. 下排每个数都是先前上排那十个数在下排出现的次数 ..........................11 1.2.3. 设计包含 min 函数的栈 ...................................................................... 14 1.2.4. 求子数组的最大和.............................................................................. 20 1.2.5. 在二元树中找出和为某一的所有路径 .............................................. 22 1.2.6. Top K 算法详细解析---百度面试 ......................................................... 29 1.2.7. 翻转句子中单词的顺序....................................................................... 31 1.2.8. 判断整数序列是不是二元查找树的后序遍历结果 ................................ 33 1.2.9. 查找最小的 K 个元素-使用最大堆....................................................... 35 1.2.10. 求二叉树中节点的最大距离................................................................ 37 1.3. 面试题集合(二) ........................................................................................ 40 1.3.1. 求 1+2+…+n....................................................................................... 40 1.3.2. 输入一个单向链表,输出该链表中倒数第 k 个结点............................. 44 1.3.3. 输入一个已经按升序排序过的数组一个数字.................................... 46 1.3.4. 输入一颗二元查找树,将该树转换为它的镜像.................................... 48 1.3.5. 输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往 右的顺序打印................................................................................................... 49 1.3.6. 在一个字符串中找到第一个只出现一次的字符。如输入 abaccdeff,则输出 b 52 1.3.7. n 个数字(0,1,…,n-1)形成一个圆圈 .................................................. 53 1.3.8. 定义 Fibonacci 数列 ............................................................................ 58 1.3.9. 左移递减数列查找某一个数.........................................

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧