分割数组
问题简述
给定整数数组 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;
Last updated