给你一个整数数组 nums
,有一个大小为 k
的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k
个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
示例 1:
输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
示例 2:
输入:nums = [1], k = 1
输出:[1]
请使用JAVA实现该算法
给你一个整数数组 nums
,有一个大小为 k
的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k
个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
示例 1:
输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
示例 2:
输入:nums = [1], k = 1
输出:[1]
请使用JAVA实现该算法
import java.util.ArrayDeque;
import java.util.Deque;
public class A {
public int[] maxSlidingWindow(int[] nums, int k) {
if (nums == null || nums.length == 0 || k == 0) return new int[0];
int[] result = new int[nums.length - k + 1];
Deque<Integer> deque = new ArrayDeque<>();
for (int i = 0; i < nums.length; i++) {
while (!deque.isEmpty() && nums[deque.peekLast()] < nums[i]) {
deque.pollLast();
}
deque.offer(i);
if (i - deque.peek() >= k) {
deque.poll();
}
if (i >= k - 1) {
result[i - k + 1] = nums[deque.peek()];
}
}
return result;
}
}
巨佬,这道题的核心思路是什么
主要是 维护一个双端队列 然后让队列中始终保持着当前滑动窗口内的最大值的索引
这种题GPT会做吗?
import java.util.Deque;
import java.util.LinkedList;
public class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if (nums == null || nums.length == 0 || k <= 0) {
return new int[0];
}
int n = nums.length;
int[] result = new int[n - k + 1]; // 结果数组
Deque<Integer> deque = new LinkedList<>(); // 双端队列,存储元素索引
for (int i = 0; i < n; i++) {
// 移除不在滑动窗口内的元素的索引
while (!deque.isEmpty() && deque.peek() < i - k + 1) {
deque.poll();
}
// 移除所有比当前元素小的元素的索引
while (!deque.isEmpty() && nums[deque.peekLast()] < nums[i]) {
deque.pollLast();
}
// 将当前元素索引添加到双端队列
deque.offer(i);
// 当达到窗口大小时,记录当前窗口的最大值
if (i >= k - 1) {
result[i - k + 1] = nums[deque.peek()];
}
}
return result;
}
public static void main(String[] args) {
Solution solution = new Solution();
int[] nums = {1,3,-1,-3,5,3,6,7};
int k = 3;
int[] result = solution.maxSlidingWindow(nums, k);
for (int num : result) {
System.out.print(num + " ");
}
}
}
肯定会 这种很简单的 基本最优解都是这么个大概写法
谢谢!
瞄了一眼 gpt写的 和我的基本一样 就多了注释
对对对,我也把你写的问他了,他说很漂亮
之前找工作时候写的,现在回看,发现自己之前好强,现在全还回去了
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
// 单调递减双端队列 队列中维护数组下标
ArrayDeque<Integer> deque = new ArrayDeque<>();
List<Integer> res = new ArrayList<>();
for(int i = 0;i<nums.length;i++) {
while(!deque.isEmpty() && nums[i] > nums[deque.peekLast()]) {
// 窗口是右移的,nums[i]比队列中的大而且存活更久,也就是说队列中的无法成为最大值
deque.pollLast();
}
deque.offerLast(i);
if(i+1>=k) {
// 开始从队头取答案,需要保证队头在当前合法区间内[i-k+1,i]
while(!deque.isEmpty() && deque.peekFirst() < i-k+1) {
deque.pollFirst();
}
res.add(nums[deque.peekFirst()]);
}
}
int[] ans = new int[res.size()];
int n = 0;
for(Integer num:res) {
ans[n] = num;
n++;
}
return ans;
}
}
半年多没登陆我的leetcode了
都有工作了还刷什么力扣
其实还是得刷,时刻准备着,只是太忙时候没空刷。不忙时候又太懒,只想刷论坛
论坛好啊 刷啥力扣