leetcode 915.分割数组题解
题目链接:
https://leetcode-cn.com/problems/partition-array-into-disjoint-intervals/
题目描述
给定一个数组 A,将其划分为两个不相交(没有公共元素)的连续子数组 left 和 right, 使得:
left 中的每个元素都小于或等于 right 中的每个元素。
left 和 right 都是非空的。
left 要尽可能小。
在完成这样的分组后返回 left 的长度。可以保证存在这样的划分方法。
思路
从题目上来看是想在数组中找到一个位置,使得这个位置左侧的数都小于右侧的数。那么数学比较好的人(没错,就是我🐶)应该马上就能想到,左侧任意数小于右侧任意数就代表左侧的最大值小于右侧的最小值。所以只要先遍历数组记录每个位置左侧的最大值和右侧的最小值,然后就可以找到满足左侧最大小于右侧最小的index值。
代码
class Solution(object):
def partitionDisjoint(self, A):
"""
:type A: List[int]
:rtype: int
"""
max_left = [0]*len(A)
min_right = [0]*len(A)
max_num, min_num = A[0], A[-1]
for i in range(len(A)):
max_num = max(max_num, A[i])
min_num = min(min_num, A[-i-1])
max_left[i] = max_num
min_right[-i-1] = min_num
for i in range(len(A) -1):
if max_left[i] <= min_right[i + 1]:
return i + 1
return len(A)