/** * 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); }
leecode 239. 滑動窗口最大值
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.