例如我在hackerrank上解决了这个问题:
"考虑一个整数数组,。我们定义两个元素之间的绝对差异,并且(where),是。的绝对值。
给定一个整数数组,找到并打印数组中任意两个元素之间的最小绝对差值。
输入格式
第一行包含一个表示整数的整数(整数)。 第二行包含空格分隔的整数,用于描述。
的相应值约束
method
输出格式
打印数组中任意两个元素之间的最小绝对差值。
示例输入
2<n<2^5
10^-9<ai<10^9
示例输出
3
3 -7 0
我的方法是用每个元素减去每个元素 并打印最小差异,但它给出了时间限制问题
答案 0 :(得分:1)
现在检查每两个连续元素之间的差异,并尽量减少差异。
Arrays.sort(arr);
int minDiff = arr[n - 1] - arr[0];
for (int i = 0; i < n - 1; i++) {
int tmpDiff = arr[i + 1] - arr[i];
if (tmpDiff < minDiff) {
minDiff = tmpDiff;
}
}
简单的观察是 - 当数组被排序时,对于任何元素arr[i]
,直接越来越小的元素将保持在左侧(i - 1
位置)和右侧(i + 1
位置)分别。使用arr[i - 1]
或arr[i + 1]
以外的元素不可能获得较小的绝对差异。 (为什么?)
这是一个简单的贪心问题。你必须多练习才能想出这样的问题。想出任何想法之后,请尝试通过 通过矛盾证明 , 通过归纳证明 来验证正确性。祝你好运!
排序将为O(nlogn)
带来一些开销以进行字符串比较。并且迭代以找到差异将花费O(n)
。所以时间复杂度总体上是O(nlog n)
。
你的想法会花费O(n^2)
,因为你要将每个元素与每个元素进行比较,这会慢得多。
答案 1 :(得分:0)
Brut force意味着您需要执行所有可能的解决方案,以验证您的问题是否已解决。
为了避免做出暴力,你需要找到一种方法来减少可能的解决方案,以便减少尝试的解决方案。