classSolution{ /** * 暴力法,时间复杂度O(n*k) */ funmaxSlidingWindow(nums: IntArray, k: Int): IntArray { val n = nums.size if (n == 0) return intArrayOf() val answer = IntArray(n - k + 1) var j = 0 for (start in0..(n - k)) { val end = start + k - 1 var max = Int.MIN_VALUE for (i in start..end) { max = Math.max(max, nums[i]) } answer[j++] = max } return answer } }
classSolution{ /** * 维护一个队列,仅存放滑动窗口内的数字,每次向队尾插入数字前,先从队首依次检查并删除小于新插入的元素,这样队首始终是滑动窗口的最大值 * 由于只会遍历数组依次,因此时间复杂度O(n),用一个队列存储滑动窗口内的元素,最多存储k个,因此空间复杂度是O(k) */ funmaxSlidingWindow(nums: IntArray, k: Int): IntArray { val n = nums.size if (n == 0) return intArrayOf() if (k == 1) return nums val answer = IntArray(n - k + 1) val queue = MonotonicQueue() for (i in0 until n) { if (i < k - 1) queue.enqueue(nums[i]) else { queue.enqueue(nums[i]) answer[i - k + 1] = queue.max() queue.dequeue(nums[i - k + 1]) } } return answer }