2015-05-28 59 views
2

我面临一个非常困难的情况,假设我有一个动态数字数组。条件是该数组可能包含10个数字到20个数字。它可以包含10,12,14,...到20个整数。现在基于ArrayList.Count(),我将从该数组中选择3(如果数组包含10个整数)到6(如果数组包含20个整数),并添加这些数字。说这个数字是“X”。从动态数组中找到整数的唯一总和

现在我要检查列表中是否存在任何三个整数,其总和等于X,如果其相等,则我必须重复相同的过程,直到我从列表中找到唯一的总和。

那么我该怎么做呢?最好的部分是数组中的所有数字都是唯一的,数组中没有重复的数字。

一是理念

我虽然一个想法,为3个数字,假设我生成一个唯一的号码。

foreach (var i in List) // values of i = 1, 5, 8 (Assume) 
{ 
    sum += listOfUniqueIntegers[i]; 
} 

//固定第一元件作为列表[I]

for (int i = 0; i < List.Count()-2; i++) 
{ 
    // Fix the second element as List[j] 
    for (int j = i+1; j < List.Count()-1; j++) 
    { 
     // Now look for the third number 
     for (int k = j+1; k < List.Count(); k++) 
     { 
      if (List[i] + List[j] + List[k] == sum) 
      { 
      // Here I will again create one more unique value 
      // and assign it to sum and repeat i = 0, j = 0, k = 0; 

      } 
     } 
    } 
} 

但是这种方法的问题是它的时间复杂度... OS N^3,所以如果我不得不产生来自6号的总和当列表大小为20时,它将是n^6,这不是预期的。

设想二

我虽然我可以对列表进行排序,但后来我将使用什么逻辑来选择3个整数,所以,它的总和在列表中是独一无二的。

比方说我对列表进行排序,并选择三个最小的数字或从排序列表中选择第3个3 + 1 =第4个和3 + 2个=第5个元素,并且sum=List[3]+List[4]+List[5];这个也没有预料到,任何模式选择三个不建议使用数字。它应该随机选择,总和应该是唯一的。

所以我没有得到任何想法为此产生最佳解决方案。

任何人都可以请帮助我。

+1

嗯,我不确定是否有一种无偏见的方式来找到避免计算每个组合并随机选择一个独特组合的独特总和。像阿米尔的答案一样,任何捷径或聪明的伎俩必然会有偏差。 – InBetween

回答

1

只使用3个最大的数字。

+1

为什么分心?在我看来,*总是*选择3最大将做的伎俩。否则,如果你有正数和负数,会发生什么? – InBetween

+0

@InBetween你说得对,我在脑海中有另一种限制。更新。 –

+0

最小的数字或三个最大的数字不是预期的情景,我更新了我的问题,甚至可以说我选择了任何数字4,然后我选择4 + 1,然后选择4 + 2元素,这也不是预期的。它应该是随机的 – Debhere

相关问题