915 分割数组 中等
发布者:admin 发表于:446天前 阅读数:560 评论:0

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
}