使用kotlin解决这个问题:239. 滑动窗口最大值 提示 困难 2.3K 相关企业 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1: 输入:nums = [1,3,-1,-3,5,3,6,7], k = 3 输出:[3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 --------------- ----- [1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7 3 1 3 [-1 -3 5] 3 6 7 5 1 3 -1 [-3 5 3] 6 7 5 1 3 -1 -3 [5 3 6] 7 6 1 3 -1 -3 5 [3 6 7] 7 示例 2: 输入:nums = [1], k = 1 输出:[1]
时间: 2023-11-27 16:50:22 浏览: 129
以下是使用 Kotlin 解决该问题的代码:
```kotlin
fun maxSlidingWindow(nums: IntArray, k: Int): IntArray {
val n = nums.size
if (n * k == 0) return intArrayOf()
if (k == 1) return nums
val left = IntArray(n)
left[0] = nums[0]
val right = IntArray(n)
right[n - 1] = nums[n - 1]
for (i in 1 until n) {
// from left to right
if (i % k == 0) left[i] = nums[i] else left[i] = maxOf(left[i - 1], nums[i])
// from right to left
val j = n - i - 1
if ((j + 1) % k == 0) right[j] = nums[j] else right[j] = maxOf(right[j + 1], nums[j])
}
val output = IntArray(n - k + 1)
for (i in 0..n - k) {
output[i] = maxOf(right[i], left[i + k - 1])
}
return output
}
```
该算法使用了双向遍历,分别从数组的左边和右边计算出每个窗口的最大值。最后将两个最大值中的较大值作为窗口的最大值。时间复杂度为 $O(n)$。
阅读全文