美文网首页
915. 分割数组(Python)

915. 分割数组(Python)

作者: 玖月晴 | 来源:发表于2021-03-20 14:46 被阅读0次

    难度:★★★☆☆
    类型:数组
    方法:逻辑

    题目

    力扣链接请移步本题传送门
    更多力扣中等题的解决方案请移步力扣中等题目录

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

    left 中的每个元素都小于或等于 right 中的每个元素。
    left 和 right 都是非空的。
    left 要尽可能小。
    在完成这样的分组后返回 left 的长度。可以保证存在这样的划分方法。

    示例 1:

    输入:[5,0,3,8,6]
    输出:3
    解释:left = [5,0,3],right = [8,6]

    示例 2:

    输入:[1,1,1,0,6,12]
    输出:4
    解释:left = [1,1,1,0],right = [6,12]

    解答

    我们要寻找一个划分点,在这个划分点左侧的所有数字的最大值,不超过在划分点右侧的子数组的最小值。

    我们定义两个数组,left_max和right_min。left_max[i]表示数组A[:i]的最大值(从左往右遍历,随时记录当前最大值填充到相应位置),right_min表示数组A[i:]的最小值(从右往左遍历,随时记录当前最小值填充到相应位置)。

    再经过一次从左往右遍历,一旦遇到合适的划分点(left_max[i] <= right_min[i+1]),则返回i+1即可。

    class Solution:
        def partitionDisjoint(self, A):
    
            cur_max, left_max = 0, []
            for a in A:
                cur_max = max(cur_max, a)
                left_max.append(cur_max)
    
            cur_min, right_min = float("inf"), []
            for a in reversed(A):
                cur_min = min(cur_min, a)
                right_min = [cur_min] + right_min
    
            for i in range(len(A)-1):
                if left_max[i] <= right_min[i+1]:
                    return i + 1
    

    如有疑问或建议,欢迎评论区留言~

    有关更多力扣中等题的python解决方案,请移步力扣中等题解析

    相关文章

      网友评论

          本文标题:915. 分割数组(Python)

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