2017-02-20 60 views
0

我必須構建一個算法,打印表格中每個數字大於其右側所有數字的算法。例A = {93,24,57,29,41}。應打印93,57,41。這是我做的:在表格中打印每個數字大於其右側的所有數字

Algorithm leader(A[0:n-1],n) 

k=0; 
for i=0 to n-2 do 
{ for j=i+1 to n-1 do 
{ if A[i]>A[j] 
    then {k=k+1; 
      B[k]=A[i];}} 
k=k+1 
B[k]=A[n-1] //Adds the last number of the table. 
return B; 
+0

如果從右向左走? – MBo

+0

@MBo它也可以是這種方式,但我想知道這是否正確 – Albanian

+1

不,您將數字放入結果數組中,當它大於任何右邊的數字時。您應該計算小於A [i]的數字,並且只有在內部迭代(j)之後,如果計數的數字與檢查的數字匹配(n - 1 - i),您應該將其推入結果數組(B)。 –

回答

-1

嗯我建議你倒退,並保存你遇到的最大數量。

因此,你會檢查你的當前數字與最大的,如果它大於這個,那麼它應該被打印,它應該是你最大的。如果不是,它不會比右側的所有數字都大。 :)

編輯

沒有您的解決方案將無法工作。在你的例子中,結果將是:93,93,93,93,57,57,41,因爲你將繼續檢查數字A [i]是否大於A [j]並且一次又一次地添加它。你可以做這樣的事情阻礙:

for i=0 to n-2 do{ 
    for j=i+1 to n-1 do{ 
     if A[i]<A[j] then { 
      <boolean flag = false> 
     } 
    } 
if <boolean flag> then { 
    k=k+1; 
    B[k]=A[i]; 
    } 
} 

k=k+1 
B[k]=A[n-1] 

注意 我已經改變了你的支票的符號從>到<。另外,您在第一個for循環中缺少'}'。

+0

我完全理解你說的話,就像你解釋過的那樣做會更有效率,但是我需要知道我寫的這個想法是否正確? – Albanian

+0

@Albanian在這裏我已經解釋了結果是什麼以及它是否會被執行。只是從好奇心,如果你只需要知道它是否會工作或爲什麼不只是執行它? – Wald

0

你的實現是錯誤的。要正確實施您的方法,您需要檢查當前剩餘項目是否比其他項目更大。可能的僞碼:

for i=0 to n-1 do 
    j = i + 1 
    while (j < n) and (A[j] < A[i]) 
    j++ 
    if j == n //we did not meet greater element 
     output A[i] 

    //possible optimization - jump to the next candidate 
    //else 
    // i = j 
相關問題