C# 找到具有一定总和的两个变量的所有值的最佳方法
我有两个变量I,j在运行时都是未知的。我有两个极限maximumi和maximumj,它们的值已知,因此I介于0和各自极限之间(与j相同)。我还有另一个变量,它在运行时是已知的,是I和j的和。在使用I和j执行特定计算之前,我需要找到I和j的所有值,它们的和等于变量和。我尝试的是使用一个嵌套的for循环,简单地强制我找到I和j的值,这样对于每一个可能的值,我添加每一个可能的j,并检查和是否等于和。这对于小极限非常有效,但当我的极限接近无穷大时,算法会变得可怕。我有一个3秒的阈值来找到这些数字。是否有适合我的情况的推荐数据结构。您只需要一个循环(例如C# 找到具有一定总和的两个变量的所有值的最佳方法,c#,algorithm,search,C#,Algorithm,Search,我有两个变量I,j在运行时都是未知的。我有两个极限maximumi和maximumj,它们的值已知,因此I介于0和各自极限之间(与j相同)。我还有另一个变量,它在运行时是已知的,是I和j的和。在使用I和j执行特定计算之前,我需要找到I和j的所有值,它们的和等于变量和。我尝试的是使用一个嵌套的for循环,简单地强制我找到I和j的值,这样对于每一个可能的值,我添加每一个可能的j,并检查和是否等于和。这对于小极限非常有效,但当我的极限接近无穷大时,算法会变得可怕。我有一个3秒的阈值来找到这些数字。是否
i
从0
到sum
),并且j
将始终等于sum-i
。无需为j
创建嵌套循环,因为其值总是已知的
int sum = 1337;
for (int i = 0; i <= sum; i++)
{
var j = sum - i;
Console.WriteLine("{0} + {1} = {2}", i, j, sum);
}
int-sum=1337;
对于(int i=0;i您只需要一个循环(例如i
从0
到sum
)和j
将始终等于sum-i
。无需为j
创建嵌套循环,因为其值总是已知的
int sum = 1337;
for (int i = 0; i <= sum; i++)
{
var j = sum - i;
Console.WriteLine("{0} + {1} = {2}", i, j, sum);
}
int-sum=1337;
对于(int i=0;ivar sum=9999999;
var max=60000000;
var最小值=10000000;
var i=最大值;
var j=总和-最大值;
var result=新列表();
而(j>=min&&j=
无需暴力,因为这很容易计算。即使在最大值和最小值之间存在较大间隙,也能在几毫秒内平稳运行。var sum=9999999;
var max=60000000;
var最小值=10000000;
var i=最大值;
var j=总和-最大值;
var result=新列表();
而(j>=min&&j=
不需要暴力,因为这很容易计算。即使在最大值和最小值之间有很大的间隙,也可以在几毫秒内平稳运行。您可以简单地枚举它们吗
List<Tuple<int, int>> options = new List<Tuple<int, int>();
for(int a=0; a < sum; a++)
options.Add(new Tuple<int, int>(a, sum-a));
List options=new List您可以简单地枚举它们吗
List<Tuple<int, int>> options = new List<Tuple<int, int>();
for(int a=0; a < sum; a++)
options.Add(new Tuple<int, int>(a, sum-a));
List options=newlistintmin(inta,intb){返回ab?a:b;}
无效对(整数和、整数最大值、整数最大值){
if(maxi+maxjintmin(inta,intb){返回ab?a:b;}
无效对(整数和、整数最大值、整数最大值){
if(maxi+maxj 对于(int i=max(0,sum-maxj);我甚至值得将其更新为已使用的延迟执行。如果数字特别大,那么它将生成一个巨大的列表,如果您只想处理一个子集(例如,前100000个),这将是一种浪费编辑:如果你需要对它们进行计数,因为组合的数量是一个常数,你可以返回一个包含IEnumerable
和计数值的复合对象。是的,如果我见过它,这很快。谢谢。放弃了列表,这对我的需要来说是不必要的。此外,我没有那种空间。@TheJackal最大值值可以不同?OP中没有最小值?@laune i和j的限制可以不同。i和j的最小值都是零,甚至可能值得将其更新为已使用的延迟执行。如果数字特别大,它将生成一个庞大的列表,如果您只想处理子集,这将是一种浪费(比如说,前10万)编辑:如果你需要对它们进行计数,因为组合的数量是一个常数,你可以返回一个包含IEnumerable
和计数值的复合对象。是的,如果我见过它,这很快。谢谢。放弃了列表,这对我的需要来说是不必要的。此外,我没有那种空间。@TheJackal最大值值可以不同?OP中没有最小值?@laune i和j的极限可以不同。i和j的最小值都是零,这要感谢kostov。这也是一个强大的代码宝石。在更大的极限上,给出了更快的时间。int sum=1337777;for(int i=0;i=0&&sum-i为此感谢kostov。这也是一个强大的代码宝库。在更大的限制上给出了更快的时间。int sum=133777777;for(int i=0;i=0&&sum-i