/** * Created by zhanghaipeng on 2019/8/9. * 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只能够看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 * 返回滑动窗口中的最大值。 * * 示例: * 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 * 输出: [3,3,5,5,6,7] * 解释: * 来源:力扣(LeetCode) * 连接:https://leetcode-cn.com/problems/sliding-window-maximum * 著做权归领扣网络全部。商业转载请联系官方受权,非商业转载请注明出处。 * * */ public class MaxSlidingWindow { public int[] maxSlidingWindow(int[] nums, int k) { //返回值 int[] res; //窗口数据 int[] win; //K不合法或数组为空或数组长度为零 返回null if(k<=0 || nums == null || nums.length == 0){ return new int[0]; }else{ int len = nums.length; //初始化返回数组, 数组长度为len - k + 1 res = new int[len - k + 1]; //初始化窗口取数组,窗口数组长度为k,内容为nums的前k个元素 //先查看前K个数据(第一个窗口),整理窗口并取得第一个窗口最大值 win = getLeftMaxArray(Arrays.copyOfRange (nums,0,k)); //取得第一个窗口的最大值 res[0] = win[0]; // for(int i = k ; i < len; i ++){ //当新进元素大于等于win[0],窗口重新进元素从新记录窗口 if(nums[i] >= win[0]){ win = new int[]{nums[i]}; } //当新进元素小于win[0],但win.length<k else if(win.length < k) { int[] temp = new int[win.length+1]; for(int m =0 ; m < win.length ; m++){ temp[m] = win[m]; } temp[win.length] = nums[i]; win = temp; } //当新进元素小于win[0],但win.length>=k,数组移除win[0],加入新元素, else if(win.length >= k) { //移除最左边元素 for(int m = 0 ; m< win.length -1;m++){ win[m] = win[m+1]; } win[win.length-1] = nums[i]; //插入后找出最大元素,而后返回以最大元素开头的数组 win = getLeftMaxArray(win); } res[i-k+1] = win[0]; } } return res; } int[] getLeftMaxArray(int[] win){ int max = 0 ; for(int i = 1 ; i < win.length; i ++){ if(win[i] >= win[max]){ max = i; } } return Arrays.copyOfRange(win,max,win.length); }