示例 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]
dp_min[i]
表示数组 nums
下标0 ~ i 的最小值,也就是lright
数组的最小值dp_max[i]
表示数组 nums
下标 n-1 ~ i 的最大值,也就是 right
数组的的最大值dp_min
和 dp_max
的值dp_max[i] <= dp_min[i]
则判定为找到结果,但是循环需要从 1 开始,因为 dp_max[0] = -sys.maxsize
#!/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()
示例 1:
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
示例 2:
输入: numRows = 1
输出: [[1]]
每个数是它左上方和右上方的数的和
操作即可.#!/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()