2017-02-22 13 views
0

私は、SwiftのsubArrayの要素によって取得できる最大値を返すメソッドを作成しようとしています。配列内の開始/終了インデックスのすべての可能な順列を見つける

私はsliceSumメソッドを実行して、ArraySliceの先頭と末尾のすべての置換をキャプチャするアルゴリズムを作成しています。

私は解決策が簡単なことは知っていますが、私はそれを理解することができません。 sliceSumメソッドを使用してすべての可能な並べ替えを実行するという目標を達成する方法を提案します。次を考える

func maxSubArray(_ nums: [Int]) -> Int { 
    var output = 0 

    func sliceSum(slice: ArraySlice<Int>) -> Int { 
     // throws out cases that don't work 
     guard slice.count > 0 || slice.count != nums.count else { return 0 } 
     return slice.reduce(0, +) 
    } 

    var begin = 0 
    var end = nums.count - 1 

    while begin < end { 
     let frontSlice = nums[begin...end] 
     if sliceSum(slice: frontSlice) > output { 
      output = sliceSum(slice: frontSlice) 
     } 

     begin += 1 
     end -= 1 
    } 

    return output 
} 

、私は次の配列のスライス[4,-1,2,1]の合計である、6を返すべきである:

let array = [-2,1,-3,4,-1,2,1,-5,4] 
maxSubArray(array) 

をお読みいただきありがとうございました。私はあなたの提案を歓迎します。

答えて

1

あなたの目標を理解していれば、2つのループが必要です。

for begin in 0..<nums.count { 
    for end in begin..<nums.count { 
     let frontSlice = nums[begin...end] 
     let sum = sliceSum(slice: frontSlice) 
     if sum > output { 
      output = sum 
     } 
    } 
} 

私もあることをごsliceSumをやり直したい:とあなたのwhileループとbeginend変数を置き換え

func sliceSum(slice: ArraySlice<Int>) -> Int { 
    if slice.count > 0 { 
     return slice.reduce(0, +) 
    } else { 
     return 0 
    } 
} 
+0

はどうもありがとうございました! 202件のテストケースのうち198件が解決されました。これは私が今学んだKadaneのアルゴリズムに最も適した仕事のようです。これをSwiftで書く方法を見つけたら、私はアップデートを投稿します。 https://en.wikipedia.org/wiki/Maximum_subarray_problem – Adrian

関連する問題