【LeetCode】915. 分割数组

题目

915. 分割数组

给定一个数组 nums ,将其划分为两个连续子数组 leftright, 使得:

  • left 中的每个元素都小于或等于 right 中的每个元素。
  • leftright 都是非空的。
  • 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]

提示:

  • 2 <= nums.length <= 105
  • 0 <= nums[i] <= 106
  • 可以保证至少有一种方法能够按题目所描述的那样对 nums 进行划分。

题解1

思路

  • 使用一个变量保存第 i i i位右侧的最小值
  • 从左往右遍历,若当前左侧最大值小于右侧最小值则返回

代码

class Solution:
    def partitionDisjoint(self, nums: List[int]) -> int:
        leftMax, rightMin = nums[0], [nums[-1]] * len(nums)
        for i in range(len(nums)-2, -1, -1):
            rightMin[i] = min(nums[i], rightMin[i+1])
        left = 1
        while left < len(nums) and leftMax > rightMin[left]:
            leftMax = max(leftMax, nums[left])
            left+=1
        return left

复杂度

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

题解2

思路

  • 一次遍历,保存遍历过程中左侧的最大值leftMax
  • 若当前值小于左侧最大值,则将游标更新到该点,并更新左侧最大值
  • 最后返回游标的位置

代码

class Solution:
    def partitionDisjoint(self, nums: List[int]) -> int:
        leftMax, currentMax = nums[0], nums[0]
        left = 0
        for i,n in enumerate(nums):
            if n > currentMax: currentMax = n
            if n < leftMax: left, leftMax = i, currentMax
        return left + 1
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pass night

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值