如果我正确理解您的问题,您正在寻找数组中的两个索引 (i, j),其中 i < j 具有最高比率 A[j]/A[i]。如果是这样,那么您可以将其简化为这个相关问题,它要求您找到 i ≤ j 的索引 (i, j),使得 A[j] - A[i] 尽可能大。这个问题有一个非常快的 O(n) 时间、O(1) 空间算法,也可以适应这个问题。直觉是解决仅由数组的第一个元素组成的数组的问题,然后是前两个元素,然后是前三个元素,等等。一旦你解决了数组的前 n 个元素的问题,你有一个问题的整体解决方案。
让我们想想如何做到这一点。最初,当您仅考虑数组的第一个元素时,通过将元素与其自身进行比较,您可以获得的最佳百分比增加是 0%。现在,假设(归纳地)您已经解决了前 k 个数组元素的问题,并且想看看当您查看下一个数组元素时会发生什么。当这种情况发生时,两个条件之一成立。首先,前 k 个元素的最大百分比增加也可能是前 (k + 1) 个元素的最大百分比增加。例如,如果第 (k+1) 个数组元素是一个非常小的数字,那么您很可能无法从前 k 个元素中的某个值到该值的百分比增加很大。其次,最大百分比增加可能是从前 k 个元素之一到第 (k + 1) 个元素。
结合这两种情况,我们得到前 k + 1 个元素的最佳百分比增加是
- 前 k 个元素的最高百分比增加,或
- 从前 k 个元素中的最小元素到第 (k + 1) 个元素的百分比增加。
您可以通过遍历数组元素来实现这一点,跟踪两个值 - 您目前看到的最小值和最大化百分比增加的对。例如,对于您的原始示例数组
1 2 3 10 1 20 40 60
该算法将像这样工作:
1 2 3 10 1 20 40 60
min 1 1 1 1 1 1 1 1
best (1,1) (1, 2) (1, 3) (1, 10) (1, 10) (1, 20) (1, 40) (1, 60)
你会输出 (1, 60) 作为最高百分比的增长。在不同的阵列上,像这样:
3 1 4 2 5
那么算法会这样追踪: 3 1 4 2 5 min 3 1 1 1 1 best (3,3) (3,3) (1,4) (1,4) (1,5)
你会输出 (1, 5)。
整个算法仅使用 O(1) 空间,运行时间为 O(n),这是一个非常好的解决问题的方法。
或者,您可以考虑通过对数组中的所有值取对数,直接将此问题简化为最大单笔销售利润问题。在这种情况下,如果您找到 log A[j] - log A[i] 最大化的一对值,这等效于(使用对数属性)找到 log (A[j] / A [i]) 被最大化。由于 log 函数是单调递增的,这意味着您已经找到了一对 A[j] / A[i] 达到预期值的值。