分割数组
给定整数数组 nums,将其划分为 left 和 right 两部分,要求:
1. left 中的每个元素都小于或等于 right 中的每个元素;
2. left 的长度要尽可能小。
返回 left 的长度,题目保证 left 和 right 都非空;
要求:
时间复杂度 O(n)
空间复杂度 O(n) 或 O(1)Last updated
给定整数数组 nums,将其划分为 left 和 right 两部分,要求:
1. left 中的每个元素都小于或等于 right 中的每个元素;
2. left 的长度要尽可能小。
返回 left 的长度,题目保证 left 和 right 都非空;
要求:
时间复杂度 O(n)
空间复杂度 O(n) 或 O(1)Last updated
class Solution:
def partitionDisjoint(self, nums: List[int]) -> int:
n = len(nums)
rmin = [float('inf')] * n
for i in range(n - 2, -1, -1):
rmin[i] = min(rmin[i + 1], nums[i])
# 合并计算 lmax 和比较过程
lmax = nums[0]
for i in range(1, n):
if lmax <= rmin[i]:
return i
lmax = max(lmax, nums[i])
return -1以 nums=[3,4,1,5,6] 为例,下面是:
初始化:
amax = 3
lmax = 3
ret = 1
for i in range(1, len(nums)):
i amax lmax ret
1 3 3 1
2 4 3 1
3 5 4 3
4 6 4 3
返回:
ret = 3class Solution:
def partitionDisjoint(self, nums: List[int]) -> int:
lmax = amax = nums[0]
ret = 1
for i in range(1, len(nums)):
amax = max(amax, nums[i])
if nums[i] < lmax:
ret = i + 1
lmax = amax
return ret