当我解决问题时,我总是对算法使用暴力,这些算法总是会出现时间限制问题。我真的不知道该怎么办?如何将我的方法从蛮力算法转变为智能算法
例如,我正在hackerrank上解决这个问题:
“考虑一个整数数组,。我们定义两个元素之间的绝对差,(其中)是的绝对值。
给定一个整数数组,找到并打印数组中任意两个元素之间的最小绝对差。
输入格式
第一行包含一个整数,表示(整数的数量)。第二行包含以空格分隔的整数,用于描述各自的值。
约束条件
2<n<2^5
10^-9<ai<10^9输出格式
打印数组中任意两个元素之间的最小绝对差。
样本输入
3
3 -7 0样本输出
3我的方法是用每个元素减去每个元素
并打印最小差值,但它给出了时间限制问题
发布于 2017-03-26 17:59:53
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),这要慢得多,因为你在比较每个元素。
发布于 2017-03-26 18:00:59
强制力意味着你需要做所有可能的解决方案,以验证你的问题是否已经解决。
为了避免使用暴力,你需要找到一种方法来减少可能的解决方案集,以便有更少的解决方案可供尝试。
https://stackoverflow.com/questions/43027301
复制相似问题