如何从强力算法转向智能算法?

时间:2017-03-26 09:54:43

标签: arrays algorithm brute-force greedy divide-and-conquer

当我解决问题时,我总是对使用时间限制问题的算法使用蛮力。 我真的不知道该怎么办? 如何将我的方法从强力算法改为智能算法

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

"考虑一个整数数组,。我们定义两个元素之间的绝对差异,并且(where),是。的绝对值。

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

输入格式

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

的相应值

约束

method

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

示例输入

2<n<2^5
10^-9<ai<10^9

示例输出

3
3 -7 0

我的方法是用每个元素减去每个元素 并打印最小差异,但它给出了时间限制问题

2 个答案:

答案 0 :(得分:1)

  1. 按升序对数组进行排序。
  2. 现在检查每两个连续元素之间的差异,并尽量减少差异。

    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;
        }
    }
    
  3. 简单的观察是 - 当数组被排序时,对于任何元素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意味着您需要执行所有可能的解决方案,以验证您的问题是否已解决。

为了避免做出暴力,你需要找到一种方法来减少可能的解决方案,以便减少尝试的解决方案。