给定一个数组 nums ,将其划分为两个连续子数组 left 和 right, 使得:
left 中的每个元素都小于或等于 right 中的每个元素。
left 和 right 都是非空的。
left 的长度要尽可能小。
在完成这样的分组后返回 left 的 长度 。
用例可以保证存在这样的划分方法。
示例 1:
输入:nums = [5,0,3,8,6] 输出:3 解释:left = [5,0,3],right = [8,6]
示例 2:
输入:nums = [1,1,1,0,6,12] 输出:4 解释:left = [1,1,1,0],right = [6,12]
方法一:利用for循环加切片的方式将数组nums分割成两个数组left和right,然后用max和min函数求出left的最大值和right的最小值,如果left_max <= right_min,则返回left的长度。
class Solution:
def partitionDisjoint(self, nums: List[int]) -> int:
for i in range(len(nums)):
left = nums[:i+1]
right = nums[i+1:]
if max(left) <= min(right):
return len(left)
执行通过,但是会超出时间限制
方法二:定义一个left_pos用来划分数组,初始化left_pos = 0 ,则left = nums[:left_pos],利用for循环遍历(1, n-1)范围内的nums,如果left_max < nums[i],则是符合要求的,否则不符合要求,更新left_pos的位置为i,更新left_max 的值为cur_max,其中cur_max为一个中间变量,用来存放nums[0]到nums[i]之间的最大值,初始化cur_max = left_max = nums[0] ,遍历完后返回left_pos+1的值即为left的长度
class Solution:
def partitionDisjoint(self, nums: List[int]) -> int:
n = len(nums)
cur_max = left_max = nums[0]
left_pos = 0
for i in range(1, n-1):
cur_max = max(cur_max, nums[i])
if nums[i] < left_max:
left_max, left_pos = cur_max, i
return left_pos + 1
最终执行通过,也没有超时