美文网首页
算法笔记之数组分割

算法笔记之数组分割

作者: 简单一点点 | 来源:发表于2020-07-01 16:56 被阅读0次

不知道这种算法思想叫啥,暂时这么叫吧。一般是滑动窗口中使用,将数组分割成一个一个块,每个块单独考虑。

LeetCode 239. 滑动窗口最大值

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

要求,返回滑动窗口中的最大值。希望在线性时间复杂度解决问题。

示例输入:
输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7]

解题思路:将数组分割成k个一组的块,这样除了最后一组都是k个。每个窗口最多只分布在2个块中,这样只要计算出窗口在每个块中的最大值,再求两者的最大值,就是窗口的最大值。

这样我们借助两个数组left和right,长度和nums数组相同,left记录每个块中从左侧到当前元素的最大元素,right记录每个块中从右侧到当前元素的最大元素,这样right[i]和left[i + k - 1]就是窗口起点为i的时候左侧和右侧块中的最大值(当然二者有可能在一个块,这时二者大小相同,不影响逻辑),求出他们的最大值即可。

Python代码:

def maxSlidingWindow(self, nums, k):
    # 分块
    n = (len(nums) - 1) // k + 1
    left = []
    # 每个块从左到右计算最大值
    for i in range(n):
        max_value = -float('inf')
        if i != n - 1:
            for j in range(i * k, (i + 1) * k):
                if nums[j] > max_value:
                    max_value = nums[j]
                left.append(max_value)
        else:
            for j in range(i * k, len(nums)):
                if nums[j] > max_value:
                    max_value = nums[j]
                left.append(max_value)
    
    # 每个块从右到左计算最大值
    right = [0 for _ in range(len(nums))]
    for i in range(n):
        max_value = -float('inf')
        if i != n - 1:
            for j in range((i + 1) * k - 1, i * k - 1,  -1):
                if nums[j] > max_value:
                    max_value = nums[j]
                right[j] = max_value
        else:
            for j in range(len(nums) - 1, i * k - 1, -1):
                if nums[j] > max_value:
                    max_value = nums[j]
                right[j] = max_value

    # 计算每个窗口最大值
    result = []
    for i in range(len(nums) - k + 1):
        result.append(max(right[i], left[i + k - 1]))
    return result

相关文章

  • 算法笔记之数组分割

    不知道这种算法思想叫啥,暂时这么叫吧。一般是滑动窗口中使用,将数组分割成一个一个块,每个块单独考虑。 LeetCo...

  • 数组平均分割算法

    题目 题目1将一个长度为n(n>0)的整型数组分割成两个数组,要求这两个数组的和之差最小题目2任意交换两个长度都为...

  • 力扣算法 - 分割数组

    题目 给定一个数组 A,将其划分为两个不相交(没有公共元素)的连续子数组 left 和 right, 使得: le...

  • javascript 算法整理

    求和算法 2 + 22 + 222 + ... + 222222... 手机号码处理为 344 格式 分割数组

  • 入门算法:归并排序

    上手难度:★★☆ 算法复杂度:O(nlogn) 排序思想: 将数组采用二分法,不断的递归分割,直至分割到单个元素,...

  • 数据结构与算法之美(二):数组

    本章内容源于笔者对极客时间《数据结构与算法之美》以下章节的学习笔记: 数组:为什么很多编程语言中数组都从0开始编号...

  • 《链表与数组》

    说明:本笔记仅供自我学习。参考极客时间王争的《数据结构与算法之美》专栏。首先我们得知道是什么数组? 数组是一种线性...

  • 重温:数据结构与算法 - 03数组

    数据结构与算法之美 - 数组 数据结构与算法之美-学习大纲 什么数组? 数组是一种 线性表 数据结构。它用一组 连...

  • javaScript数据结构和算法--快速排序

    快速排序时最常用的排序算法,和归并排序一样也是采用分治方法,但没有把数组分割开,也是将原数组分成较小的数组。 1、...

  • 数据结构与算法学习笔记之 提高读取性能的链表

    数据结构与算法学习笔记之 提高读取性能的链表(上) 前言 链表(Linked list)比数组稍微复杂一点,在我们...

网友评论

      本文标题:算法笔记之数组分割

      本文链接:https://www.haomeiwen.com/subject/ssrhqktx.html