滑动窗口最大值为什么-1
时间: 2023-11-13 16:04:58 浏览: 96
根据提供的引用内容,无法确定滑动窗口最大值为什么会是-1。请提供更多的信息或上下文以便更好地回答您的问题。同时,我可以为您解释一下滑动窗口的概念和如何求解滑动窗口中的最大值。
滑动窗口是一种常见的算法思想,通常用于解决数组/字符串中的子数组/子串问题。滑动窗口的基本思想是维护一个大小为k的窗口,该窗口从数组的最左侧开始移动到最右侧,每次移动一个位置。在每个位置上,我们可以计算窗口内的某些值,并根据这些值来更新答案。
对于求解滑动窗口中的最大值,我们可以使用双端队列来实现。具体来说,我们可以维护一个双端队列,该队列存储的是窗口中的元素下标。在每个位置上,我们首先判断队列中的队首元素是否已经超出了窗口的范围,如果是,则将其从队列中弹出。然后,我们将当前位置的元素加入队列中,并从队列的队尾开始,将所有小于当前元素的元素弹出。这样,队列的队首元素就是当前窗口中的最大值。
相关问题
使用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]
以下是使用 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)$。
滑动窗口最大值
滑动窗口最大值问题是指给定一个长度为 n 的整型数组 nums 和一个正整数 k,从数组的最左边开始,滑动一个长度为 k 的窗口,每次向右移动一个位置,求出每个窗口中元素的最大值。
解决这个问题可以使用双端队列(deque)来维护每个窗口的最大值。具体思路是:双端队列中存储的是当前窗口中的元素下标,队头元素为当前窗口中的最大值。每次向右移动窗口时,将队头元素所对应的值加入结果数组中,并将队头元素弹出。然后将新元素从队尾依次与队列中的元素比较,如果比队列中的元素大,则将队列中的元素弹出,直到队列为空或者队列中的元素比新元素大为止。最后将新元素的下标加入队尾。这样就可以维护一个单调递减的队列,队列中的元素是当前窗口中的最大值及其后续的可能成为最大值的元素。
以下是C++实现代码:
```cpp
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> res;
deque<int> q;
for (int i = 0; i < nums.size(); i++) {
if (!q.empty() && q.front() == i - k) q.pop_front(); // 弹出队头元素
while (!q.empty() && nums[q.back()] < nums[i]) q.pop_back(); // 从队尾依次弹出比新元素小的元素
q.push_back(i); // 将新元素加入队尾
if (i >= k - 1) res.push_back(nums[q.front()]); // 将队头元素加入结果数组
}
return res;
}
```
阅读全文