一个整数数组,返回所有元素两两之差绝对值最小的值 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)的还是很牵强。高手们给看看呗。
...全文
973 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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就是最好的了。

33,027

社区成员

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

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