求满足一定条件的整数之差的最大和

Finding greatest sum of difference between integers that meet a certain condition

本文关键字:整数 条件 满足      更新时间:2023-10-16

我有一个1,000,000个整数的列表。每个整数的取值范围小于等于100000。

我必须找到两个整数之差的最大和,其中第一个整数小于第二个整数,第二个整数大于第三个整数。第三个整数可以大于或小于第一个整数。此外,第一个整数必须位于第二个整数之前,第二个整数必须位于第三个整数之前。

我解决这个问题的算法如下:

1)通过循环运行提供的列表。

2)选择当前读取的整数之后最大的整数。

3)求其与当前整数的差值。

4)选择在第(2)部分整数之后的最小整数。求该整数与第(2)部分整数之差。

5)将其与第(3)部分中找到的整数相加,并将该值存储为当前最大值。

6)重复此过程,必要时替换当前最高的。

然而,我解决这个问题的算法不符合时间限制(每个测试用例1秒)。对于一些测试用例,这也是不正确的。我正在使用c++供您参考。

下面提供了一个示例。

输入:607030.50406020.10

80

输出:

说明:列表中的第3、第6、第8个整数满足最优条件。

我的问题:解决这个问题最好(最快)的方法是什么?

当前方法的问题

你当前的算法不太正确,考虑一下顺序:

1,99,1,100,99

您当前的算法将选择以下情况(不同的情况对应不同的起始位置):

1,100,99 score 100
99,100,99 score 2
1,100,99 score 100

然而,最好的选择是1,99,1,分数为98*2=196

而且复杂度是O(n^2),这会太慢。

更好的算法

A O(n)的方法是计算一个数组A[n],它给出0,1,…范围内的最小值。,n-1,以及给出n+1,n+2,…,end范围内最小值的数组B[n]。

你可以在O(n)的时间内计算出这些,通过在数组中向前工作得到A,向后工作得到b。

一旦有了这些,就可以第三次遍历数组。对于每个索引i,选择A[i]作为第一个元素,i作为中间元素,B[i]作为第三个元素。

你计算出这个组合的分数,并保留最好的那个。

(您也可以将这些通道组合起来,以获得稍微复杂但可能更有效的解决方案。)

是否从列表中选择三个连续的整数?

如果不是,那么显然排序列表并选择最小、最大、最小总是赢家?

如果你必须从列表中使用三个连续的整数,那么你真的别无选择,只能按顺序处理列表,找出差异并保留最大的?

我把这个问题解释为你必须选择三个整数,其中A,B,C在列表中以相同的顺序出现,但不一定是连续的,对吗?

如果是这样,想象一下将列表分成N个子序列,每个子序列包含M个数字。对于每个子序列,找出最大和最小的数。

然后使用这些来选择最小,最大,最小或最大最小最大的最佳序列。

只要每次选择都在不同的子序列中,那么就完成了。如果两个数字恰好在相同的子序列中,那么您需要检查它们是否以正确的顺序出现。如果不是,则放弃该解决方案并选择下一个最佳解决方案。

我建议可能选择大约1000个元素的子序列大小会给你一个非常低的概率,两个数字在同一个序列中,仍然减少了很多比较。

==============

替代回答

假设我们有两个连续的十个数字的子序列,你在每个子序列中计算出最好的ABC,那么我有两个ABC序列,我可以很容易地组合它们,只有几种方法来组合这些序列,其中一种组合必须是最好的对于20个元素的列表。

你可以创建这个动态样式