算法 - 单调栈01(Swift版本)

4 阅读1分钟

算法系列:数组

题目1:739. 每日温度

讲解

class Solution {
    func dailyTemperatures(_ temperatures: [Int]) -> [Int] {
        var stack = [Int]()
        var res = Array(repeating: 0, count: temperatures.count)
        stack.append(0)
        // 栈里不会为空
        for i in 1..<temperatures.count {
            guard let last = stack.last else { continue }
            if temperatures[i] <= temperatures[last] {
                stack.append(i)
            } else {
                while let last = stack.last, temperatures[i] > temperatures[last] {
                    let top = stack.removeLast()
                    res[top] = i - top
                }
                stack.append(i)
            }
        }
        return res
    }
}

题目2:496. 下一个更大元素 I

讲解

class Solution {
    func nextGreaterElement(_ nums1: [Int], _ nums2: [Int]) -> [Int] {
        var map = Dictionary(uniqueKeysWithValues: nums1.enumerated().map { ($0.element, $0.offset )})
        var res = Array(repeating: -1, count: nums1.count)
        var stack = [0]
        for i in 1..<nums2.count {
            // 省略nums2[i] <= nums2[last] 的额外写法,最后统一都是stack.append(i)
            while let top = stack.last, nums2[i] > nums2[top] {
                stack.removeLast()
                if let resIndex = map[nums2[top]] {
                    res[resIndex] = nums2[i]
                }
            }
            stack.append(i)
        }
        return res
    }
}

题目3:503. 下一个更大元素 II

讲解

class Solution {
    func nextGreaterElements(_ nums: [Int]) -> [Int] {
        // 环形数组,循环到2*nums.count 。 用 i % nums.count 做处理
        var res = Array(repeating: -1, count: nums.count)
        var stack = [0]
        for i in 1..<(2*nums.count) {
            while let top = stack.last, nums[i % nums.count] > nums[top] {
                res[top] = nums[i % nums.count]
                stack.removeLast()
            }
            stack.append(i % nums.count)
        }
        return res
    }
}