[Swift]白駿17298-呉大洙

2437 ワード


質問リンク
最初は2層for文で問題を解いた.

タイムアウトの回答


import Foundation

let n = Int(readLine()!)!
var array = readLine()!.split(separator: " ").map({Int(String($0))!})

for i in 0..<n-1 {
    
    var result = 0
    
    for j in i+1..<array.count {
        
        if array[j] > array[i] {
            result = array[j]
            break
        }
    }
    
    print(result != 0 ? result : -1,terminator: " ")
}

print(-1)
もちろん、タイムアウトしました.
数の範囲からすると当然ですが、これでテスト用例を解決したので、夢中になるのをあきらめず、これで何をしたいのかずっと考えていました^^;;
いずれにしても、私はそれを投げました.アルゴリズムの下にスタックがあるので、スタックで解いてみました...!
でも知らなかった.
人の解答を参考にして解答する.
まず2つの配列が必要です.
readLine()を使用して入力した配列と
整数以下の桁数を持つstack
まず、スタックが空でない場合.
現在の値が
  • 配列[stack.last]より大きい場合、これは5つの大きな数です.
    したがって、
  • は、「array[stack.removeLast()]=現在値」を「現在値」に設定し、その位置の値をstackから削除し、返される現在位置値をarray配列の対応する位置に整数を追加します.
  • 現在の値が
  • 配列[stack.last]より小さい場合、現在のビット値は、あまり多くないためstackに追加されます.
  • stackが空の場合は、最初の要素であるため、現在の位置値をstackに追加します.
    上記操作が完了すると、
    array配列では、大きな整数を持つ要素だけが大きな整数の値を変更します.
    stack配列には整数を持たない要素のビット値が含まれています.
    したがって、for文を使用してarrayのstack位置の要素値を-1に変更できます.

    最終コード

    
    import Foundation
    
    let n = Int(readLine()!)!
    var array = readLine()!.split(separator: " ").map({Int(String($0))!})
    var stack = [Int]()
    
    for i in 0..<n {
    
        while !stack.isEmpty && array[stack.last!] < array[i] {
            array[stack.removeLast()] = array[i]
        }
        
        stack.append(i)
    }
    
    for i in stack {
        
        array[i] = -1
    }
    
    print(array.map{String($0)}.joined(separator: " "))
    
    難しいけど、面白い!!