问题描述
给定一个数组 A,将其划分为两个不相交(没有公共元素)的连续子数组 left 和 right, 使得:
left 中的每个元素都小于或等于 right 中的每个元素。
left 和 right 都是非空的。
left 要尽可能小。
在完成这样的分组后返回 left 的长度。可以保证存在这样的划分方法。
例子
image.png
解题思路
构造两个长度为n的数组,一个数组存储的是该位置之前的最大值,一个数组存储的该位置的之后的最小值。然后比较连个数组,找到右边的最小值 大于左边的最大值的位置。
class Solution:
def partitionDisjoint(self, A: List[int]) -> int:
l_max = [0 for i in range(len(A))] #最大值数组
r_min = [0 for i in range(len(A))] #最小值数组
l_max[0] = A[0]
r_min[-1] = A[-1]
for i in range(1, len(A)): #更新最大值数组
l_max[i] = max(A[i], l_max[i-1])
for i in range(len(A)-2, -1, -1):
r_min[i] = min(A[i], r_min[i+1])
for i in range(1, len(A)): #找到位置
if l_max[i-1] <= r_min[i]:
return i
2 从头开始遍历到最后,每次遍历保存最大值,位置,左边数组的最大值
class Solution:
def partitionDisjoint(self, A: List[int]) -> int:
k=0
tem=A[0] #左边数组的最大值
m=A[0] #遍历的的数组的最大值
for i in range(1,len(A)):
m=max(m,A[i]) #更新最大值
if A[i]
k=i
tem=m
return k+1