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);
    }