“`java
暴力
class Solution {
public int[] maxAltitude(int[] heights, int limit) {
if (heights == null || heights.length == 0) {
return new int[0];
}
int length = heights.length;
int[] res = new int[length – limit + 1];
for (int i = 0; i < length - limit + 1; i++) {
int max = Integer.MIN_VALUE;
for (int k = i; k < limit + i; k++) {
if (heights[k] > max) {
max = heights[k];
}
}
res[i] = max;
}
return res;
}
}
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
//用单调队列
int[] res = new int[nums.length-k+1];
int index =0;
LinkedList list = new LinkedList<>();
for(int i=0;i<nums.length;i++){
while(!list.isEmpty()&&nums[list.peekLast()]<nums[i]){
list.pollLast();
}
list.add(i);
if(list.peekLast()-klist.peek()){
list.poll();
}
if(i+1>=k){
res[index++]=nums[list.peek()];
}
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
if k == 1: return nums
deque = collections.deque()
res = []
for i, j in zip(range(1 - k, len(nums) - k + 1), range(len(nums))):
if i > 0 and deque[0] == nums[i-1]: deque.popleft()
while deque and deque[-1] < nums[j]: deque.pop()
deque.append(nums[j])
if i >= 0: res.append(deque[0])
return res
for (int i = 0; i < nums.size(); i++) {
// 如果窗口中的元素已经超出窗口大小的范围,则移除窗口最左边的元素
while (!window.empty() && window.front() <= i - k)
window.pop_front();
// 从窗口尾部开始,移除所有小于当前元素的索引
while (!window.empty() && nums[i] >= nums[window.back()])
window.pop_back();
// 将当前元素的索引加入窗口
window.push_back(i);
// 当窗口大小达到k时,将窗口最左边的元素加入结果
if (i >= k - 1)
result.push_back(nums[window.front()]);
}
return result;
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
q = deque()
res = []
for i in range(len(nums)):
while q and nums[q[-1]] <= nums[i]:
q.pop()
q.append(i)
if q[0] == i - k:
q.popleft()
if i >= k - 1:
res.append(nums[q[0]])
return res
class Solution {
public:
vector maxSlidingWindow(vector& nums, int k) {
std::deque l;
std::vector result(nums.size() - k + 1);
for (int i = 0; i < nums.size(); i++) {
// remove the last element
if (i >= k && nums[i - k] == l.front()) l.pop_front();
// add new element
while (!l.empty() && l.back() < nums[i]) l.pop_back();
l.push_back(nums[i]);
// record the max for this window
if (i >= k - 1) result[i - k + 1] = l.front();
}
return result;
}
};
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int n = nums.length;
Deque<Integer> deque = new LinkedList<Integer>();
for (int i = 0; i < k; ++i) {
while (!deque.isEmpty() && nums[i] >= nums[deque.peekLast()]) {
deque.pollLast();
}
deque.offerLast(i);
}
int[] ans = new int[n - k + 1];
ans[0] = nums[deque.peekFirst()];
for (int i = k; i < n; ++i) {
while (!deque.isEmpty() && nums[i] >= nums[deque.peekLast()]) {
deque.pollLast();
}
deque.offerLast(i);
while (deque.peekFirst() <= i - k) {
deque.pollFirst();
}
ans[i - k + 1] = nums[deque.peekFirst()];
}
return ans;
}
}
共以下 19 个回答
“`java
暴力
class Solution {
public int[] maxAltitude(int[] heights, int limit) {
if (heights == null || heights.length == 0) {
return new int[0];
}
int length = heights.length;
int[] res = new int[length – limit + 1];
for (int i = 0; i < length - limit + 1; i++) { int max = Integer.MIN_VALUE; for (int k = i; k < limit + i; k++) { if (heights[k] > max) {
max = heights[k];
}
}
res[i] = max;
}
return res;
}
}
class Solution { list = new LinkedList<>();
public int[] maxSlidingWindow(int[] nums, int k) {
//用单调队列
int[] res = new int[nums.length-k+1];
int index =0;
LinkedList
for(int i=0;i<nums.length;i++){
while(!list.isEmpty()&&nums[list.peekLast()]<nums[i]){
list.pollLast();
}
list.add(i);
if(list.peekLast()-klist.peek()){
list.poll();
}
if(i+1>=k){
res[index++]=nums[list.peek()];
}
}
}
单调队列解决滑动窗口最大值问题
时间复杂度是O(k*N), 空间复杂度是O(k)
双端队列,时间复杂度O(n) 空间复杂度O(k)
“`C++ maxSlidingWindow(vector & nums, int k) { result; window; // 存放窗口中的元素索引
vector
vector
deque
}
“`
队列
滑动窗口 加 deque
【思路】用一个额外的list维护max candidate,每次window向右移则从队头取出最大(如果和被discard的元素相同)并将新元素添加至队尾(先删除队尾所有小于它的元素)
【复杂度】这种方法对于k较大的case来说比较友好,使得时间复杂度降低(从O(nk)降低为O(n)),但(因为无法对传入的nums数组做inplace运算,会导致空间复杂度的上升(从O(1)上升为O(n))
官解 单调队列
时间:O(n)
空间:O(n)
思路:建立队列存放可能成为最大元素的下标,如果当前元素从尾到头比较小于他的都去掉,
当i – k queue.peek()时去掉头,当i + 1 >= k时存入最大元素头
维护一个自己的单调队列。
时间复杂度:O(N)
空间复杂度:O(k)
时间复杂度O(n)
MY时间复杂度:O(n)
额外空间复杂度:O(k)