Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找可以表示为数组中三个不同元素之和的所有数字_Java_C++_Dynamic Programming - Fatal编程技术网

Java 查找可以表示为数组中三个不同元素之和的所有数字

Java 查找可以表示为数组中三个不同元素之和的所有数字,java,c++,dynamic-programming,Java,C++,Dynamic Programming,您有一个数组A,其中包含N个不同的正整数。您还有一个空集合S。您的任务是向集合S添加尽可能多的整数。如果整数可以表示为数组A的三个不同元素之和,并且在集合S中不存在,则可以向集合S添加整数 示例-如果N=5,且数组包含2、4、6、8、9。 然后该集合包含9个元素-->12、14、15、16、17、18、19、21、23 O(n^3)方法很简单,但对于大型阵列需要花费大量时间。有人能提出一个有效的方法来解决这个问题吗 不确定我的解决方案是否真的比蛮力方法快(期待笑声和否决票)。但是,我的解决方案使

您有一个数组A,其中包含N个不同的正整数。您还有一个空集合S。您的任务是向集合S添加尽可能多的整数。如果整数可以表示为数组A的三个不同元素之和,并且在集合S中不存在,则可以向集合S添加整数

示例-如果N=5,且数组包含2、4、6、8、9。 然后该集合包含9个元素-->12、14、15、16、17、18、19、21、23


O(n^3)方法很简单,但对于大型阵列需要花费大量时间。有人能提出一个有效的方法来解决这个问题吗

不确定我的解决方案是否真的比蛮力方法快(期待笑声和否决票)。但是,我的解决方案使用动态规划。。。我想:)

其基本思想是问题(N,1)的解是微不足道的。输入数组中每个1元组值的总和就是输入数组

问题(N,M)的解决方案可以使用问题(N,M-1)的解决方案,通过简单地映射(N,M-1)解决方案中的所有元素,看起来像
Map[Int]Int
。现在,(N,M-1)解决方案的特定元素中尚未使用的所有索引需要与(N,M-1)解决方案中的每个键组合,并且(N,M-1)解决方案的值之和+未使用索引的值创建(N,M)解决方案的元素

这里是我们的递归。以及我们对“更简单”结果(N,M-1)解的记忆,我们用它来解(N,M)。因此,我们采用了动态规划方法。(递归+记忆=动态规划)

在我目前尝试学习的语言(Haskell)中,我提出了这个实现(这可能被许多人认为是丑陋的;)

导入数据。数组
导入数据。列表
导入符合条件的Data.Map.Strict作为映射
类型Lut=Map.Map[Int]Int
foo::数组Int->Int->Int->Int->Lut
--这是我们的基本情况。为(N,1)案例创建映射。
--“input!i”是指其他语言编写的输入[i]。
foo input n 1=Map.fromList[([i],输入!i)| i(i:k,输入!i+query k))未使用
哪里
--\\表示差异。
--所有索引减去a(N,M-1)键中使用的索引
--元素。
未使用=fmap(\i->(i,k))(全部\\k)
查询k=
case Map.k查找的lut
只要v->v
无->错误“键不能在地图中!”
--通过排序删除重复项(例如[1,2,3]和[1,3,2])。
固定键=
fmap(\(k,v)->(排序k,v))l
to1BasedArray l=listArray(1,长度l)l
原始=[2,4,6,8,9]
输入=原始数据
输出=foo输入(原始长度)3

在流行需求下,这里的C++版本……:

#包括“stdafx.h”
#包括
#包括
#include//sort()
#包括
typedef std::矢量数据;
typedef std::向量键;
typedef std::映射Lut;
自动包含(常量键和索引、大小索引)->bool
{
用于(自动x:索引)
{
if(x==索引)
返回true;
}
返回false;
}
自动未使用(大小、常数键和k)->键
{
关键成果;
结果:储备量(n);
对于(尺寸i=1;i Lut
{
Lut结果;
开关(m)
{
案例1:

例如,如果一个元素是2^i,@Ante
S
最后总是会有(最多?!)
comb n M
元素。其中
comb n M=n!/M!/(n-M)!
。实际上,增长是O(f(n))=n!/(6*(n-3!),也就是O(n^3)因此,在最坏的情况下,完全不可能有比暴力方法更有效的和平号解决方案case@BitTickler是的,梳(n,3)=n*(n-1)*(n-2)/6,即~(n-1)^3/6.我在理解您的代码时遇到问题。如果您能添加一些注释就好了,因为我不认识Haskell。@ArnavKaushik添加了一些注释。您应该立即添加语言标记,而不是14小时后;)