2013-03-08 34 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數組中的元素,請繼續更新它。繼續操作,直到達到第一個元素。