2016-11-08 7 views
0

配列から最大部分文字列を数え、合計と開始点と終了点を返すコードを作成しようとしています。しかし、私はそこにいくつかのエラーがありますが、例えば、私がArray(-2, 1, -3, 4, -1, 2, 1, -5, 4)をソースとして使用した場合、返信が(7, 5,8)になるため、私は見つけられません。ただし、正解は(6, 3, 6)である必要があります。以下のコード。動的スタイルを使用するMaxSubArray

def solve(a: Array[Int]): (Int, Int, Int) = { 
    require(a.nonEmpty) 

    val n = a.length 
    val temp = Array.fill(n)(0, 0, 0) 
    var max = (0,0,0)      // sum, start, end 

    for (i <- 0 to n-1) { 
     temp(i) = (a(i), i, i) 
    } 

    for (i <- 0 to n-1) { 
     for (j <- 0 to i) { 
     if (a(i) > a(j) && temp(i)._1 < temp (j)._1 + a(i)) { 
      temp(i) = (temp(j)._1 + a(i), j, i) 
     } 
     } 
    } 
    for (i <- 0 to n-1){ 
     if (max._1 < temp(i)._1){ 
     max = temp(i)  
     } 
    } 
    return max 

} 

答えて

0

さらに多くのスカラ/機能アプローチはありますか?

def solve(a: Array[Int]): (Int, Int, Int) = { 
    a.tails.zipWithIndex.flatMap{ 
     case (arr, ti) => 
     arr.inits.map{ 
      tail => (tail.sum, ti, ti + tail.length -1) 
     } 
    }.maxBy(_._1) 
    } 

solve (Array(-2, 1, -3, 4, -1, 2, 1, -5, 4)) => res7: (Int, Int, Int) = (6,3,6) 
+0

ソリューションは少なくとも立方体ではありませんか? –

+0

私はそれを最適化しようとはしませんでしたが、ソリューションを直接的に表現するためだけでした。実際、上記の@jwvhの解は同じ複雑さであり、我々は同じO(n^2)個の部分列を生成し、それぞれを独立して合計する。 ここに追加できる最適化ポイントはたくさんありますが、それは正しい答えを得ることから始まります。 – Iadams

+0

正しい答えを得ることは絶対に自明です。 O(n)時間に正解を得ることは、この問題の原因です。 O(n^2)は、最適化について考えることができる出発点です。それより悪いことは、/ dev/nullにまっすぐ進むかもしれません。 –

関連する問題