给定一个数组 nums ,将其划分为两个连续子数组 left 和 right, 使得:
left 中的每个元素都小于或等于 right 中的每个元素。
left 和 right 都是非空的。
left 的长度要尽可能小。
在完成这样的分组后返回 left 的 长度 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/partition-array-into-disjoint-intervals
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
其实该题最难的点在于理解题意,题目中对于分割数组给出了三个要求,即left 中的每个元素都小于或等于 right 中的每个元素、left 和 right 都是非空的、left 的长度要尽可能小。经过剖析,要解决此问题必须要遵循一个法则就是——分割数组的左半部分的最大值要小于分割数组的右半部分的最小值,该位置则为划分的位置。那么我们就可以开始着手尝试,首先定义两个数组,然后分别从头和尾遍历数组,前向遍历的过程中将nums[0]设置为max,开始逐步与下一个数值比较并求出最大值填入lefr数组中,right数组的情况跟left相反,最终得到left、right数组每个位置的最大值或是最小值。通过一个遍历找出第一次left数组最大值小于或等于right数组最小值的位置即为最后解。
代码:
class Solution: def partitionDisjoint(self, nums: list[int]) -> int: ''' 中心思想:左边的最大值小于右边的最小值 :param nums:传入数组 :return: 返回left长度 ''' # 数组长度 len_nums = len(nums) # 设置左边数组最大值为nums[0] left_max = nums[0] # 设置右边数组最小值为nums[-1] right_min = nums[-1] # 比较整个数组找出左边最大值数字位置 left = [0 for i in range(len_nums)] for i in range(1, len_nums): if i == 1: left[0] = left_max left[i] = max(left[i - 1], nums[i]) # 比较整个数组找出右边最小值数字位置 right = [0 for i in range(len_nums)] for i in range(len_nums - 2, -1, -1): if i == len_nums - 2: right[-1] = right_min right[i] = min(right[i + 1], nums[i]) print(left) print(right) for i in range(1, len_nums): if (left[i - 1] <= right[i]): return i if __name__ == '__main__': i = Solution().partitionDisjoint(nums=[1,1]) print(i)