[Codility] 5. MinAvgTwoSlice


[Codility] 5. MinAvgTwoSlice


質問リンク


MinAvgTwoSlice

問題の概要


長さN、整数の配列Aおよび範囲0<=PAの中で最小平均値の範囲の開始位置(P)を求めます.

要求


N is an integer within the range [2..100,000]
each element of array A is an integer within the range [−10,000..10,000]

コード#コード#


2時間も理解できなかったのでグーグルをしました.
コメントリンク
  • a<=bの場合、aとbの平均値はa以上である.
  • (ただし、a=bの場合、aおよびbの平均値はaまたはb)
  • .
  • (a+b)<=(c+d)の場合、(a,b)と(c,d)の平均値は(a+b)以上である.
  • すなわち、大きいから小さいまでの割当数を等しくすることが平均である.
  • は、最終的に、要素が4つ(a,b,c,d)の成分が(a,b)および(c,d)である場合、各群の平均値はより小さい.
  • 2人のグループを考えると4つのグループは確認不要!!
  • 例外の場合、2つのグループと1つのグループを3つのグループで決定する必要があります.
    問題の所与の条件(P<=QではなくP
    
    public func solution(_ A : inout [Int]) -> Int {
        var minAvg: Double = 0.0
        var minIdx = Int()
        var flagVal: Double = 0.0
    
        minAvg = Double(A[0] + A[1]) / 2.0
        for i in 2..<A.count {
            flagVal = Double(A[i-2]+A[i-1]+A[i]) / 3.0
            if(minAvg > flagVal) {
                minAvg = flagVal
                minIdx = i-2
            }
    
            flagVal = Double(A[i-1] + A[i]) / 2.0
            if(minAvg > flagVal) {
                minAvg = flagVal
                minIdx = i-1
            }
        }
    
        return minIdx
    }