mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-08 00:43:04 +08:00
添加 239. 滑动窗口最大值 Swift版本
This commit is contained in:
@ -418,6 +418,112 @@ var maxSlidingWindow = function (nums, k) {
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Swift:
|
||||||
|
```Swift
|
||||||
|
/// 双向链表
|
||||||
|
class DoublyListNode {
|
||||||
|
var head: DoublyListNode?
|
||||||
|
var tail: DoublyListNode?
|
||||||
|
var next: DoublyListNode?
|
||||||
|
var pre: DoublyListNode?
|
||||||
|
var value: Int = 0
|
||||||
|
init(_ value: Int = 0) {
|
||||||
|
self.value = value
|
||||||
|
}
|
||||||
|
func isEmpty() -> Bool {
|
||||||
|
return self.head == nil
|
||||||
|
}
|
||||||
|
func first() -> Int? {
|
||||||
|
return self.head?.value
|
||||||
|
}
|
||||||
|
func last() -> Int? {
|
||||||
|
return self.tail?.value
|
||||||
|
}
|
||||||
|
func removeFirst() {
|
||||||
|
if isEmpty() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let next = self.head!.next
|
||||||
|
self.head?.next = nil// 移除首节点
|
||||||
|
next?.pre = nil
|
||||||
|
self.head = next
|
||||||
|
}
|
||||||
|
func removeLast() {
|
||||||
|
if let tail = self.tail {
|
||||||
|
if let pre = tail.pre {
|
||||||
|
self.tail?.pre = nil
|
||||||
|
pre.next = nil
|
||||||
|
self.tail = pre
|
||||||
|
} else {
|
||||||
|
self.head = nil
|
||||||
|
self.tail = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func append(_ value: Int) {
|
||||||
|
let node = DoublyListNode(value)
|
||||||
|
if self.head != nil {
|
||||||
|
node.pre = self.tail
|
||||||
|
self.tail?.next = node
|
||||||
|
self.tail = node
|
||||||
|
} else {
|
||||||
|
self.head = node
|
||||||
|
self.tail = node
|
||||||
|
self.pre = nil
|
||||||
|
self.next = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 单调队列, 从大到小
|
||||||
|
class MyQueue {
|
||||||
|
// var queue: [Int]!// 用数组会超时
|
||||||
|
var queue: DoublyListNode!
|
||||||
|
init() {
|
||||||
|
// queue = [Int]()
|
||||||
|
queue = DoublyListNode()
|
||||||
|
}
|
||||||
|
// 滑动窗口时弹出第一个元素, 如果相等再弹出
|
||||||
|
func pop(x: Int) {
|
||||||
|
if !queue.isEmpty() && front() == x {
|
||||||
|
queue.removeFirst()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 滑动窗口时添加下一个元素, 移除队尾比 x 小的元素 始终保证队头 > 队尾
|
||||||
|
func push(x: Int) {
|
||||||
|
while !queue.isEmpty() && queue.last()! < x {
|
||||||
|
queue.removeLast()
|
||||||
|
}
|
||||||
|
queue.append(x)
|
||||||
|
}
|
||||||
|
// 此时队头就是滑动窗口最大值
|
||||||
|
func front() -> Int {
|
||||||
|
return queue.first() ?? -1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Solution {
|
||||||
|
func maxSlidingWindow(_ nums: [Int], _ k: Int) -> [Int] {
|
||||||
|
// 存放结果
|
||||||
|
var res = [Int]()
|
||||||
|
let queue = MyQueue()
|
||||||
|
// 先将前K个元素放入队列
|
||||||
|
for i in 0 ..< k {
|
||||||
|
queue.push(x: nums[i])
|
||||||
|
}
|
||||||
|
// 添加当前队列最大值到结果数组
|
||||||
|
res.append(queue.front())
|
||||||
|
for i in k ..< nums.count {
|
||||||
|
// 滑动窗口移除最前面元素
|
||||||
|
queue.pop(x: nums[i - k])
|
||||||
|
// 滑动窗口添加下一个元素
|
||||||
|
queue.push(x: nums[i])
|
||||||
|
// 保存当前队列最大值
|
||||||
|
res.append(queue.front())
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
-----------------------
|
-----------------------
|
||||||
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>
|
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>
|
||||||
|
Reference in New Issue
Block a user