def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
# 维护一个队列,放入那些可能为最大值元素的下标,初始值为第一个元素索引
queue = []
res = []
for _ in range(len(nums)):
# 判断队列结尾的元素如果小于等于当前元素要删除
while queue and nums[queue[-1]] <= nums[_]:
queue.pop(-1)
queue.append(_)
if queue[-1] - k == queue[0]:
queue.pop(0)
if _ +1 >= k:
res.append(nums[queue[0]])
return res
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int[] ans = new int[nums.length - k + 1];
int[] q = new int[nums.length];
int hh = 0, tt = -1;
for (int i = 0; i < k - 1; i++) {
if (hh <= tt && q[hh] <= i - k) hh++;
while (hh <= tt && nums[q[tt]] <= nums[i]) tt--;
q[++tt] = i;
}
for (int i = k - 1; i < nums.length; i++) {
if (hh <= tt && q[hh] <= i - k) hh++;
while (hh <= tt && nums[q[tt]] <= nums[i]) tt--;
q[++tt] = i;
ans[i - k + 1] = nums[q[hh]];
}
return ans;
}
}
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
# 队列
n = len(nums)
q = collections.deque()
for i in range(k):
while q and nums[i] >= nums[q[-1]]:
q.pop()
q.append(i)
ans = [nums[q[0]]]
for i in range(k,n):
while q and nums[i] >= nums[q[-1]]:
q.pop()
q.append(i)
while q[0] <= i - k:
q.popleft()
ans.append(nums[q[0]])
return ans
public int[] maxSlidingWindow(int[] nums, int k) {
if (nums == null || nums.length == 0) return new int[0];
//双指针方式
/* List<Integer> res = new ArrayList<>();
int left = 0;
int right = k - 1;//index
while (right < nums.length) {
int max = Integer.MIN_VALUE;
for (int i = left; i <= right; i++) {
max = Math.max(max, nums[i]);
}
res.add(max);
left++;
right++;
}
return res.stream().mapToInt(Integer::valueOf).toArray();*/
//滑动窗口 双端队列
Deque<Integer> deque = new LinkedList<>();
int[] res = new int[nums.length - k + 1];
for (int i = 0, j = 1 - k; i < nums.length; i++) {
if (j > 0 && deque.peekFirst() == nums[j - 1]) {
deque.removeFirst();
}
while (!deque.isEmpty() && deque.peekLast() < nums[i]) {
deque.removeLast();
}
deque.addLast(nums[i]);
if (j > 0) {
res[j] = deque.peekFirst();
}
}
return res;
}
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
deque = collections.deque()
res ,n = [],len(nums)
for i,j in zip(range(1-k,n+1-k),range(n)):
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
class Solution {
//暴力解法(超出时间限制)
//时间复杂度O(nk)
//空间复杂度 O(1)
public int[] maxSlidingWindow(int[] nums, int k) {
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i <= nums.length - k; i++) {
int max = Integer.MIN_VALUE;
for (int j = i; j < i + k; j++) {
if (nums[j] > max) {
max = nums[j];
}
}
list.add(max);
}
int[] res = list.stream().mapToInt(Integer::valueOf).toArray();
return res;
}
//使用队列
//时间复杂度O(n)
//空间复杂度 O(k)
public int[] maxSlidingWindow2(int[] nums, int k) {
if (nums.length == 0 || k == 0) return new int[0];
Deque<Integer> deque = new LinkedList<>();
List<Integer> list = new ArrayList<Integer>();
// 未形成窗口
for (int i = 0; i < k; i++) {
while (!deque.isEmpty() && deque.peekLast() < nums[i])
deque.removeLast();
deque.addLast(nums[i]);
}
list.add(deque.peekFirst());
// 形成窗口后
for (int i = k; i < nums.length; i++) {
if (deque.peekFirst() == nums[i - k])
deque.removeFirst();
while (!deque.isEmpty() && deque.peekLast() < nums[i])
deque.removeLast();
deque.addLast(nums[i]);
list.add(deque.peekFirst());
}
return list.stream().mapToInt(Integer::valueOf).toArray();
}
}
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
//方法一 滑动窗口 但是时间超了
int left = 0, right = k - 1;
int[] res = new int[nums.length - k + 1];
int max = nums[0];
while(right <= nums.length - 1){
for(int i = left; i < right + 1; i++){
max = Math.max(max, nums[i]);
}
res[left] = max;
right++;
left++;
max = nums[left];
}
return res;
//方法二 优先队列
int[] res = new int[nums.length - k + 1];
LinkedList<Integer> queue = new LinkedList<>();
int cur = 0;
for(int i = 0; i < nums.length; i++){
while(!queue.isEmpty() && nums[queue.peekLast()] <= nums[i]){
queue.pollLast();
}
queue.add(i);
if(queue.peekLast() - k == queue.peek()){
queue.poll();
}
if(i + 1 >= k){
res[cur++] = nums[queue.peek()];
}
}
return res;
}
}
//自己写的暴力,超时
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
List<Integer> list = new ArrayList<>();
for(int i = 0;i <= nums.length - k;i++){
int max = Integer.MIN_VALUE;
for(int j = i;j < i+k;j++){
max = Math.max(max,nums[j]);
}
list.add(max);
}
return list.stream().mapToInt(Integer::valueOf).toArray();
}
}
时间复杂度O(n)空间复杂度O(k)最多维护k个元素
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if(nums == null || nums.length <= 1){
return nums;
}
int len = nums.length;
//队首维护最大值
LinkedList<Integer> deque = new LinkedList<>();
int[] ret = new int[len - k + 1];
int index = 0;
for(int i = 0;i < len;i++){
//单调队列,队列为空或出现新元素大于当前维护窗口的最小值
while(!deque.isEmpty() && nums[deque.peekLast()] <= nums[i]){
deque.pollLast();
}
deque.add(i);
//新加入元素后,窗口满了,溢出队首元素
if(deque.peekLast() - deque.peek() == k){
deque.poll();
}
//i遍历到第一个窗口的右边界
if(i + 1 >= k){
ret[index++] = nums[deque.peek()];
}
}
return ret;
}
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if (nums == null || nums.length <= 1) {
return nums;
}
LinkedList<Integer> queue = new LinkedList<>();
int[] res = new int[nums.length - k + 1];
int index = 0;
for (int i = 0; i < nums.length; i++) {
while (!queue.isEmpty() && nums[queue.peekLast()] <= nums[i]) {
queue.pollLast();
}
queue.add(i);
if (queue.peekLast() - k == queue.peek()) {
queue.poll();
}
if (i + 1 >= k) {
res[index++] = nums[queue.peek()];
}
}
return res;
}
}
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
stack = []
res = []
m = 0
for i in range(k):
while stack and stack[-1] < nums[i]:
stack.pop(-1)
stack.append(nums[i])
res.append(stack[0])
for i in range(k, len(nums)):
if nums[i-k] == stack[0]:
stack.pop(0)
while stack and stack[-1] < nums[i]:
stack.pop(-1)
stack.append(nums[i])
res.append(stack[0])
return res
共以下 24 个回答
借助双端队列实现,栈顶元素为最大值
双指针
这么晚还在打卡啊
hh,网课刷不动了,来刷刷题
时间:O(n)
空间:O(n)
时间O(n)
空间O(k)
双向队列,移动去取最大值,时间复杂度O(n),空间复杂度 O(k)
时间复杂度O(n)
想半天。。。看了视频解析也想半天。。。
思路类似于单调栈
时间复杂度O(n)空间复杂度O(k)最多维护k个元素
第一道题
“`c++> findContinuousSequence(int target) {> ans; temp;
class Solution {
public:
vector
int sum = 1;
vector
int i = 1, j = 1;
while(i*2 < target) { if(sum < target) { j++; sum += j; }else if(sum > target) {
sum -= i;
i++;
} else {
vector
for(int k = i; k <= j; k++) { temp.push_back(k); } ans.push_back(temp); sum -= i; i++; j++; sum += j; } } return ans; } };
时间复杂度为O(n),空间复杂度为O(k)
时间:O(n),空间:O(k)
//数据结构 que; maxSlidingWindow(vector & nums, int k) { res;
class Solution {
public:
class mydata{
public:
deque
void push(int val){
while(!que.empty()&&val>que.back()) que.pop_back();
que.push_back(val);
}
void pop(int val){
if(valque.front()) que.pop_front();
}
int front(){
return que.front();
}
};
vector
mydata que;
for(int i=0;i<k-1;++i) que.push(nums[i]);
vector
for(int i=k-1;i<nums.size();++i){
que.push(nums[i]);
res.push_back(que.front());
que.pop(nums[i-k+1]);
}
return res;
};
时间复杂度 O(n)