[Codility] 3. TapeEquilibrium


[Codility] 3. TapeEquilibrium
質問リンク
TapeEquilibrium
問題の概要
整数Pは、|(A[0]+A[1]+.+A[P21])|として定義される.すなわち、整数Nが与えられると、配列にA[N]を含む左側要素の総和から、A[N]の右側にある要素値を減算した数の絶対値がPとなる.
可能なすべてのP(N)に対して最小値を求める.
要求
整数Nの範囲は
N is an integer within the range [2..100,000]
だから時間の間違いに注意しなければならない.
時間の複雑さはいつもパターンを手配する必要があるようです.
无知を缲り返すと、答えは见つからない.

イニシャルコード

import Foundation
import Glibc

public func solution(_ A : inout [Int]) -> Int {
    var arr = Int()
    var arr2 = Int()
    var num: Int = Int.max

    if A.count < 3 {
        return abs(A[0] - A[1])
    }

    for i in 1..<A.count {
        A[0...i-1].forEach {
            arr += $0
        }
        A[i..<A.count].forEach {
            arr2 += $0
        }
        num = abs(arr-arr2) < num ? abs(arr-arr2) : num
        arr = 0
        arr2 = 0
    }
    return num
}

やはり無知なコードはあり得ない.

コードの変更

import Foundation
import Glibc

public func solution(_ A : inout [Int]) -> Int {
    var P = Int()
    var sum = Int()
    var minDiff = Int.max

    A.forEach { 
        sum += $0
    }

    for (idx, _) in A.enumerated() {
        if idx > 0 {
            P += A[idx-1]
            minDiff = abs((P*2) - sum) < minDiff ? abs((P*2) - sum) : minDiff
        }
    }
    return minDiff
}

いつも刺激的...