首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从蛮力算法转向智能算法?

如何从蛮力算法转向智能算法?
EN

Stack Overflow用户
提问于 2017-03-26 17:54:43
回答 2查看 433关注 0票数 0

当我解决问题时,我总是对算法使用暴力,这些算法总是会出现时间限制问题。我真的不知道该怎么办?如何将我的方法从蛮力算法转变为智能算法

例如,我正在hackerrank上解决这个问题:

“考虑一个整数数组,。我们定义两个元素之间的绝对差,(其中)是的绝对值。

给定一个整数数组,找到并打印数组中任意两个元素之间的最小绝对差。

输入格式

第一行包含一个整数,表示(整数的数量)。第二行包含以空格分隔的整数,用于描述各自的值。

约束条件

代码语言:javascript
运行
复制
2<n<2^5
10^-9<ai<10^9

输出格式

打印数组中任意两个元素之间的最小绝对差。

样本输入

代码语言:javascript
运行
复制
3
3 -7 0

样本输出

代码语言:javascript
运行
复制
3

我的方法是用每个元素减去每个元素

并打印最小差值,但它给出了时间限制问题

EN

回答 2

Stack Overflow用户

发布于 2017-03-26 17:59:53

  1. 按升序对数组进行排序。
  2. 现在每隔两个连续元素检查一次差异,并将差异最小化。

Arrays.sort(arr);int minDiff = arrn -1- arr;for (int i= 0;i

简单的观察是-当数组排序时,对于任何元素arr[i],紧接着的较小和较大的元素将分别留在左侧(i - 1th位置)和右侧(i + 1th位置)。与arr[i - 1]arr[i + 1]以外的元素没有可能获得更小的绝对差异。(为什么?)

这是一个简单的贪婪问题。你必须多练习才能想出解决这类问题的办法。在提出任何想法后,尝试用矛盾的证明、归纳证明来验证正确性。祝好运!

编辑

排序将使用O(nlogn),但会有一些字符串比较的开销。而迭代来找出差异将需要O(n)。因此,总体上时间复杂度将是O(nlog n)

你的想法将采用O(n^2),这要慢得多,因为你在比较每个元素。

票数 1
EN

Stack Overflow用户

发布于 2017-03-26 18:00:59

强制力意味着你需要做所有可能的解决方案,以验证你的问题是否已经解决。

为了避免使用暴力,你需要找到一种方法来减少可能的解决方案集,以便有更少的解决方案可供尝试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43027301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档