leecode 239. 滑動窗口最大值

/**
 * 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);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章