一、题目
给定一个数组 nums ,将其划分为两个连续子数组 left 和 right, 使得:
① left 中的每个元素都小于或等于 right 中的每个元素。
② left 和 right 都是非空的。
③ left 的长度要尽可能小。
在完成这样的分组后返回 left 的 长度 。
用例可以保证存在这样的划分方法。
来源:力扣
二、思路
left数组最大值小于righ数组最小值
right储存的是nums数组当前下标nums[i]到数组尾nums[L-1]这一段的最小值。因为范围是i到L-1,所以从数组尾开始倒序循环。这是第一次遍历,目的是更新right数组的值。
第二次遍历则是不断更新m_left,并与right比较。m_left存储了nums[0]到当前下标的nums[i]的最大值。
在第二次循环中,i作为left与right两个数组的分界点,nums[0]到nums[i]为left,nums[i+1]到nums[L-1]则是right,m_left与right[i+1]相比,即是left的最大值与right的最小值相比。
class Solution:
def partitionDisjoint(self, nums: List[int]) -> int:
L=len(nums)
right=[0 for _ in range(L)]
right[-1]=nums[-1] # 0 0 0 0 0 12
for i in range(L - 2, 0, -1): # 4 3 2 1
right[i] = min(right[i + 1], nums[i]) # 4-6 3-0 2-0 1-0
m_left=nums[0]
for i in range(L - 1):
m_left = max(m_left, nums[i])
if m_left <= right[i + 1]:
return (i + 1)
找左边最大值比右边最小值的割点,从左往右统计最大值,从右往左统计最小值即可