【LeetCode 刷题笔记 2022-10-24】

2022-10-24 笔记

  • 915. 分割数组
    • 1. 题目
    • 2. 示例
    • 3. 注意事项
    • 4. Python 代码
    • 5. 评测结果
  • 118. 杨辉三角
    • 1. 题目
    • 2. 示例
    • 3. 注意事项
    • 4. Python 代码
    • 5. 评测结果

915. 分割数组

1. 题目

【LeetCode 刷题笔记 2022-10-24】_第1张图片

2. 示例

示例 1:

输入:nums = [5,0,3,8,6]
输出:3
解释:left = [5,0,3],right = [8,6]

示例 2:

输入:nums = [1,1,1,0,6,12]
输出:4
解释:left = [1,1,1,0],right = [6,12]

3. 注意事项

  • 难度:中等
    • 动态规划
    • 定义
      - dp_min[i] 表示数组 nums下标0 ~ i 的最小值,也就是lright数组的最小值
      - dp_max[i] 表示数组 nums 下标 n-1 ~ i 的最大值,也就是 right 数组的的最大值
    • 先求出dp_mindp_max 的值
    • 如果 dp_max[i] <= dp_min[i] 则判定为找到结果,但是循环需要从 1 开始,因为 dp_max[0] = -sys.maxsize
  • 提示:
    • 2 <= nums.length <= 105
    • 0 <= nums[i] <= 106
    • 可以保证至少有一种方法能够按题目所描述的那样对 nums 进行划分。
  • 来源:力扣(LeetCode)
  • 链接:传送门
  • 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

4. Python 代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2022/10/24 15:41
# @Author  : David
# @File    : 915. 分割数组.py
# @Description : 915. 分割数组
import sys
from typing import List

"""
    给定一个数组 nums ,将其划分为两个连续子数组 left 和 right, 使得:
    
        1. left 中的每个元素都小于或等于 right 中的每个元素。
        2. left 和 right 都是非空的。
        3. left 的长度要尽可能小。
    在完成这样的分组后返回 left 的 长度 。
    
    用例可以保证存在这样的划分方法。
    
    提示:
        2 <= nums.length <= 105
        0 <= nums[i] <= 106
        可以保证至少有一种方法能够按题目所描述的那样对 nums 进行划分。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/partition-array-into-disjoint-intervals
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
"""


class Solution(object):
    def partitionDisjoint(self, nums: List[int]) -> int:
        """
            直接模拟
            :param nums: 目标数组
            :return: 返回 left 数组的最小长度
        """

        n = len(nums)
        answer = 0
        dp_max, dp_min = [-sys.maxsize] * (n + 1), [sys.maxsize] * (n + 1)

        # dp_min[i]: 表示下标 i~len(nums) 的最小值
        for i in range(n - 1, -1, -1):
            dp_min[i] = min(dp_min[i + 1], nums[i])

        # dp_max[i]: 表示下标 0~i 的最大值
        for i in range(1, n + 1):
            dp_max[i] = max(dp_max[i - 1], nums[i - 1])

        for i in range(1, n):
            if dp_max[i] <= dp_min[i]:
                answer = i
                break

        return answer

    def Main(self):
        nums = [5, 0, 3, 8, 6]
        print(nums)
        print(self.partitionDisjoint(nums))


if __name__ == '__main__':
    Solution().Main()

5. 评测结果

【LeetCode 刷题笔记 2022-10-24】_第2张图片


118. 杨辉三角

1. 题目

【LeetCode 刷题笔记 2022-10-24】_第3张图片

【LeetCode 刷题笔记 2022-10-24】_第4张图片

2. 示例

示例 1:

输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]

示例 2:

输入: numRows = 1
输出: [[1]]

3. 注意事项

  • 难度:简单
    • 简单题目,直接按照题目里面说的每个数是它左上方和右上方的数的和 操作即可.
  • 提示:
    • 1 <= numRows <= 30
  • 来源:力扣(LeetCode)
  • 链接:传送门
  • 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

4. Python 代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2022/10/24 16:57
# @Author  : David
# @File    : 118. 杨辉三角.py
# @Description : 118. 杨辉三角
from typing import List

"""
    给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
    
    在「杨辉三角」中,每个数是它左上方和右上方的数的和。

    提示:
        1 <= numRows <= 30

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/pascals-triangle/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
"""


class Solution(object):
    def generate(self, num_rows: int) -> List[List[int]]:
        dp = []
        n = num_rows - 1  # 下标从 0 开始
        if n >= 0:
            dp.append([1])

        if n >= 1:
            dp.append([1, 1])

        if n >= 2:
            for row in range(2, num_rows):
                t = [1]
                for col in range(1, row):
                    t.append(dp[row - 1][col] + dp[row - 1][col - 1])
                t.append(1)
                dp.append(t)

        return dp

    def Main(self):
        num_rows = 5
        print(self.generate(num_rows))


if __name__ == '__main__':
    Solution().Main()

5. 评测结果

【LeetCode 刷题笔记 2022-10-24】_第5张图片


你可能感兴趣的:(LeetCode刷题,1024程序员节,leetcode,python)