【LeetCode】915、分割数组【中等 49.9%】【简单模拟】

文章目录

915、分割数组

一、思路

题目需寻找最短左数组,使左数组每一项均小于右数组。

从左向右遍历数组每一项

  • 情况1:若 cur 比 leftMax 小,则 cur 一定属于子数组,更新 左数组的 index 为 curIndex 即可。
  • 情况2:若 cur 比 leftMax 大,则 不确定,需继续向后遍历看看

为了实现上述逻辑,需维护 leftMax,可通过记录 iteratedMax实现。即当情况2发生时维护 iteratedMax,并当情况1发生时更新左数组的 index,和使 leftMax = iteratedMax。

根据题目描述,对于数组left,它的第一个成员就是nums[0],即:下图中的32。然后我们需要遍历nums数组中的每个数字,当发现遍历的这个数字nums[i]大于32的时候,则表示这个数字暂时可能不属于数组left。那么当发现遍历的这个数字nums[i]小于或等于32的时候,则可以判断出这个数字一定是属于数组left的。

那么由于题目中提到,left 中的每个元素都小于或等于 right 中的每个元素,所以我们需要一个变量leftMax来保存数组left中的最大数字,以及下标index,用于划分数组left和数组right。只要发现遍历的数字小于或等于leftMax时,我们就可以通过移动index来划分出新的数组left。当我们遍历完所有的nums数组中的数字之后,index指向的位置就是数组left的最后一个元素的位置。那么数组left的长度就等于index + 1了。具体操作,请见下图所示:

在这里插入图片描述
参考题解链接

二、编码

class Solution:
    def partitionDisjoint(self, nums: List[int]) -> int:
        index = 0 # 左数组的下标
        leftMax = nums[0] # 左数组的最大值
        iteratedMax = nums[0] # 已遍历的最大值
        for i in range(1, len(nums)):
            if nums[i] < leftMax:
                index = i # 更新左数组下标
                leftMax = iteratedMax # 更新leftMax
            else:
                iteratedMax = max(iteratedMax, nums[i]) # 维护 iteratedMax
        return index + 1 # 因为题目求的是数组长度,所以为数组下标+1
  • 可参考的case:
    • 输入:nums = [1,3,1,0,6,12]
    • 输出:4
    • 解释:left = [1,3,1,0],right = [6,12]
  • 时间复杂度:O(N)
  • 空间复杂度:O(1)

猜你喜欢

转载自blog.csdn.net/jiaoyangwm/article/details/127504236