2013-03-08 76 views
2

我的算法应该发现从当前最大权数在输入array,例如给出下面的int[]输入:查找在阵列算法计算当前数量,最大的权数

5,9,6,1,3,2

我的算法将输出:

9,6,3,3,2,2

这里是我当前的代码:

public static int[] FindGreatestRightNumber(int[] input) 
{ 
    var output = new int[input.Length]; 
    for (var i = 0; i < input.Length; i++) 
    { 
     int maxRightNumber = (i == input.Length - 1 ? input[i] : 0); 

     for (var j = i+1; j < input.Length; j++) 
     { 
      var currentNumber = input[j]; 
      if (maxRightNumber < currentNumber) 
       maxRightNumber = currentNumber; 
     } 
     output[i] = maxRightNumber; 
    } 

    return output; 
} 

有人告诉我,这可能是快很多,怎么样?任何想法?

UPDATE:请不要在你的答案使用LINQ,我想熟悉更快的方法来解决使用简单的代码,没有LINQIEnumerable扩展等方法

+2

@Saen:该algorthm是:'对于每个输入数,输出的最大的* *下列数字,或输出的输入数目,如果没有以下numbers.',至少根据给定的例子。 – 2013-03-08 08:32:18

+0

是的,我想知道为什么输出序列中没有'5'。鉴于修正后的算法,我不确定它可能会更快。 – 2013-03-08 08:34:13

回答

6

您可以从右手侧的单次做到这一点。诀窍是实现maxRightVal(N)= MAX(maxRightVal(N + 1),值(N + 1))

var output = new int[input.Length]; 
output[input.Length-1] = input[input.Length-1]; 

for(int i = input.Length - 2; i >= 0; i--) 
    output[i] = output[i+1] > input[i+1] ? output[i+1] : input[i+1]; 
+0

这显然是答案。并打了我一分钟。 ;) – 2013-03-08 08:44:46

+0

@Lc。你的公式中的_n_是什么? – 2013-03-09 07:51:33

+0

@YairNevet元素索引 – 2013-03-09 08:09:12

2

问题很简单,如果你想跳过一些项目和搜索的最大

int[]arr = {5, 9, 6, 1, 3, 2}; 
int currentIndex = 2; 
int currentValue = 6; 
int max = arr.Skip(currentIndex).Where(f => f > currentValue).Max(); 

编辑如果你想简单数组排序,然后:

int[] sorted = arr.OrderByDescending(); 
2

为什么不只是使用Enumerable.Max()方法?

返回Int32值序列中的最大值。

int[] input = new int[] { 5, 9, 6, 1, 3, 2 }; 
int biggest = input.Max(); 
Console.WriteLine(biggest); // 9 

这里是一个DEMO

因为,我现在好了看到问题,弗拉德的answer看起来是正确的。

+2

他希望每个数字右边的最大数字。弗拉德的回答更接近正确。 – 2013-03-08 08:37:20

0

这需要最大值,以各元素的权利;

int[] input = {5, 9, 6, 1, 3, 2}; 
int[] output = input 
      .Take(input.Length-1) 
      .Select((x,i) => input.Skip(i+1).Max()).ToArray(); 
2

开始从第(n-2)个元素,其中保持被初始化与第n个元件的电流最大值阵列。如果当前元素大于max数组中的元素,请继续更新它。继续操作,直到达到第一个元素。