915. 分割数组 中等

给定一个数组 A,将其划分为两个连续子数组 left 和 right, 使得:

  • left 中的每个元素都小于或等于 right 中的每个元素。
  • left 和 right 都是非空的。
  • left 的长度要尽可能小。

在完成这样的分组后返回 left 的长度。可以保证存在这样的划分方法。

示例 1:

输入:[5,0,3,8,6]
输出:3
解释:left = [5,0,3],right = [8,6]

示例 2:

输入:[1,1,1,0,6,12]
输出:4
解释:left = [1,1,1,0],right = [6,12]

提示:

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

代码参考:

package main

import "fmt"

func main() {
    fmt.Println(partitionDisjoint([]int{5, 0, 3, 8, 6})) // 3
}

// 按题的描述
// 用两个 max 变量记录左侧最大值和数组最大值,类似快慢指针的思路
func partitionDisjoint(A []int) int {
    leftMax, curMax, edge := A[0], A[0], 1
    for i, a := range A {
        // fmt.Println("a", a, "leftMax", leftMax, "curMax", curMax)
        if leftMax > a { // 比左侧最大值还小,左小数组向右拉长
            leftMax = curMax // 目前的最大值同步到 leftMax
            edge = i + 1
        }
        if a > curMax {
            curMax = a
        }
    }
    return edge
}
最后编辑: kuteng  文档更新时间: 2021-06-05 10:16   作者:kuteng