求满足一定条件的整数之差的最大和
Finding greatest sum of difference between integers that meet a certain condition
我有一个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个元素的列表。
你可以创建这个动态样式
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 如何反转整数参数包
- enum是C++中的宏变量还是整数变量
- 努力将整数转换为链表。不知道我在这里做错了什么
- 整数不会重复超过随机数
- 在C++中手动调整数组大小
- 检查输入是否不是整数或数字
- C++使用整数的压缩数组初始化对象
- 在没有太多条件句的情况下,我如何避免被零除
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 基于多个条件处理地图中的所有元素
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 条件constexpr函数
- 无论条件是否为true,if总是在c++中执行
- 正在LLVM中检测整数比较条件
- 而无符号整数条件的循环
- 如何使用条件来检查类型名 T 是否是 C++ 中浮点类型的整数类型
- 条件语句,用于验证事务模块(.cpp)标头中#define(d)整数提供的范围
- 求满足一定条件的整数之差的最大和
- 在条件语句中指定一个整数