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