LeetCode10.24每日打卡分割数组

给定一个数组 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)

你可能感兴趣的:(1024程序员节)