难度:★★★☆☆
类型:数组
方法:逻辑
题目
力扣链接请移步本题传送门
更多力扣中等题的解决方案请移步力扣中等题目录
给定一个数组 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解决方案,请移步力扣中等题解析
网友评论