【问题标题】:How to move from brute force algorithm to smart algorithms? [closed]如何从蛮力算法转向智能算法? [关闭]
【发布时间】:2017-08-19 00:47:23
【问题描述】:

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

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

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

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

输入格式

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

约束

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

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

示例输入

3
3 -7 0

样本输出

3

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

【问题讨论】:

  • 当您没有正确复制问题或显示您的任何尝试时,很难提供帮助
  • 对于瓷砖中的问题,遗憾的是没有一般收据。一个人必须“聪明”。你可以通过学习算法和数据结构获得一些经验。
  • @cricket_007 我复制正确
  • 这句话不完整... "我们定义两个元素之间的绝对差,并且 (where ) 是 的绝对值。"

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


【解决方案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;
        }
    }
    

简单的观察是 - 对数组进行排序时,对于任何元素 arr[i],立即较小和较大的元素将分别留在左侧(i - 1th 位置)和右侧(i + 1th 位置)。除了arr[i - 1]arr[i + 1] 之外的元素,不可能获得更小的绝对差异。 (为什么?)

这是一个简单的贪心问题。您必须进行更多练习才能为此类问题提出想法。提出任何想法后,尝试通过矛盾证明归纳证明来验证其正确性。祝你好运!

编辑

排序将占用O(nlogn),并带有一些用于字符串比较的开销。并且迭代以找出差异将需要O(n)。所以时间复杂度总体上将是O(nlog n)

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

【讨论】:

  • 排序数组是另一个需要时间的操作,所以排序+查找最小差异不会比我的代码花费更多时间吗?
  • @AaqibSoomro 检查更新。我已经接受了这个想法。
【解决方案2】:

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

为了避免蛮力,您需要找到一种方法来减少可能的解决方案集,以便尝试更少的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多