915. 分割数组(Python)

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

题目

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

给定一个数组 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))