17. LeetCode 239. 滑动窗口最大值

LeetCode 239. 滑动窗口最大值

天津科技大学第六届科技文化节算法设计大赛第17题
难度:困难

题目:

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回滑动窗口中的最大值。

示例 1:

输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
解释:
滑动窗口的位置 最大值


[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
示例 2:

输入:nums = [1], k = 1
输出:[1]
示例 3:

输入:nums = [1,-1], k = 1
输出:[1,-1]
示例 4:

输入:nums = [9,11], k = 2
输出:[11]
示例 5:

输入:nums = [4,-2], k = 2
输出:[4]

提示:

1 <= nums.length <= 105
-104 <= nums[i] <= 104
1 <= k <= nums.length

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sliding-window-maximum

解题思路:

  1. 解法1:滑动数组,在每个状态里进行归并(冒泡/快速/堆)排序,取最大值加入列表
  2. 解法2:滑动数组,使用max()方法直接获取
  3. 问题:大数据量时会运行超时,这就是本题看似简单实际上困难之处

源代码

    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        def merge(list_left, list_right):

    # 两个数组的起始下标
            l, r = 0, 0

            new_list = []
            while l < len(list_left) and r < len(list_right):
                if list_left[l] <= list_right[r]:
                    new_list.append(list_left[l])
                    l += 1
                else:
                    new_list.append(list_right[r])
                    r += 1
            new_list += list_left[l:]
            new_list += list_right[r:]
            return new_list


        def merge_sort(mylist):
            """归并排序
            mylist: 待排序数组
            return: 新数组list
            """
            if len(mylist) <= 1:
                return mylist

            mid = len(mylist) // 2
            list_left = merge_sort(mylist[:mid])
            list_right = merge_sort(mylist[mid:])
            return merge(list_left, list_right)
        alist=[]
        while(len(nums)>=k):
            snums=merge_sort(nums[0:k])
            alist.append(snums[-1])
            nums.remove(nums[0])
        return alist

结果

17. LeetCode 239. 滑动窗口最大值_第1张图片

你可能感兴趣的:(算法,LeetCode,leetcode,算法,职场和发展)