分割数组
问题简述
给定整数数组 nums,将其划分为 left 和 right 两部分,要求:
1. left 中的每个元素都小于或等于 right 中的每个元素;
2. left 的长度要尽可能小。
返回 left 的长度,题目保证 left 和 right 都非空;
要求:
时间复杂度 O(n)
空间复杂度 O(n) 或 O(1)
思路1
记
lmax[i]
表示nums[:i]
中的最大值,rmin[i]
表示nums[i:]
中的最小值;返回使
lmax[i - 1] <= rmin[i]
的最小i
;这里要
<=
,否则意味着所有相同的最小值会被分到 left,不符合题意;
优化:计算 lmax
和比较的过程都是顺序遍历,可以合并到一起,节省部分空间;
思路2
时间复杂度
O(n)
,空间复杂度O(1)
使用
lmax
记录已划分 left 中的最大值;根据题意,left 的中至少会存在一个元素,因此可以初始化
lmax=nums[0]
;
使用
amax
记录遍历过程中的最大值;当
nums[i] < lmax
时,说明需要扩充 left,即需要把i
之前的所有元素都添加到 left;同时更新lmax=amax
;
以 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 = 3
Last updated