2016-10-10 2 views
-3

Ich habe folgende code so gut übersetzt ich kann von Java nach C#:Index Outside of Bounds auf Vektormaximierungsalgorithmus

public double maxProfit(double[] prices, int K) 
     { 
      if (K == 0 || prices.Length == 0) 
      { 
       return 0; 
      } 

      var dp = new double[K + 1, prices.Length]; 

      for (int i = 1; i < K + 1; i++) 
      { 
       double maxDiff = -prices[0]; 
       for (int j = 1; j < prices.Length; j++) 
       { 
        dp[i, j] = Math.Max(dp[i, j - 1], prices[j] + maxDiff); 
        maxDiff = Math.Max(maxDiff, dp[i - 1, j] - prices[j]); 
       } 
      } 

      printTrans(dp, prices, K); 


      return dp[K, prices.Length - 1]; 
     } 

     public void printTrans(double[,] dp, double[] prices, int K) 
     { 
      int i = K - 1; 
      int j = prices.Length; 

      var priceList = new List<double>(); 
      while (true) 
      { 
       if (i == 0 || j == 0) 
       { 
        break; 
       } 

       if (dp[i, j] == dp[i, j - 1]) 
       { 
        j = j - 1; 
       } 
       else 
       { 
        priceList.Add(j); 
        double maxDiff = dp[i, j] - prices[j]; 
        for (int z = j - 1; z >= 0; z--) 
        { 
         if (dp[i - 1, z] - prices[z] == maxDiff) 
         { 
          i = i - 1; 
          j = z; 
          priceList.Add(j); 
          break; 
         } 
        } 
       } 
      } 

      while (priceList.Count > 0) 
      { 
       Console.WriteLine("Buy @ " + prices[priceList.IndexOf(0)]); 
       Console.WriteLine("Sell @ " + prices[priceList.IndexOf(0)]); 
      } 
     } 

Fehler treten in der zweiten Methode auf den Leitungen:

if (dp[i, j] == dp[i, j - 1]) 

und

for (int z = j - 1; z >= 0; z--) 
    { 
    if (dp[i - 1, z] - prices[z] == maxDiff) 

Ich bekomme eine Index was outside the bounds of the array. Error. Ich verstehe, was dieser Fehler bedeutet, aber ich habe keine Ahnung, wie ich diesen Fehler beheben kann. Es hat mich einiges gekostet, den ersten Teil dieses Codes zu verstehen, aber für den zweiten Teil bin ich ratlos.

Auch was ist das C# -Aquivalent der Java pollFirst() Methode?

+1

erstellen, welche Zeile Sie den Fehler zu bekommen? –

+0

@MiguelSanchez Ich habe die Antwort bearbeitet, um zu zeigen, wo der Fehler auftritt. –

+0

Das Äquivalent von [pollFirst()] (http://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html) vorausgesetzt, Sie verwenden .NET [LinkedList] (https://msdn.microsoft.com/en-us/library/he2s3bh7.aspx) ist [Erste] (https://msdn.microsoft.com/en-us/library/ms132187.aspx) und wenn es nicht null ist, rufen Sie [ RemoveFirst] (https://msdn.microsoft.com/en-us/library/ms132181.aspx) – Martheen

Antwort

1

Wahrscheinlich Diese Linie ist die Ursache

public void printTrans(double[,] dp, double[] prices, int K) 
     { 
      int i = K - 1; 
      int j = prices.Length; // <=== this line is the cause 

sein die j verursacht einen Index außerhalb der Grenzen der 2D-Arrays zu verweisen.

Wenn Sie von java portiert haben, überprüfen Sie Ihren Java-Code.

machen Entweder diese Linie

int j = prices.Length - 1; 

Oder Sie müssen Änderungen an, wie Sie Ihre Array

var dp = new double[K + 1, prices.Length]; // <-- prices.Length would have to change here 
+0

und ich fühle mich dumm. Danke für die Hilfe! –

Verwandte Themen