leetcode 56 合并区间
本题与重叠区间的思路基本一致,需要注意的是如何更新结果里的区间元素。本题先将第一个区间放入result中,然后将其与接下来的区间进行比较来决定更不更新区间
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
result = []
if len(intervals) == 0: return result
intervals.sort(key = lambda x: x[0])
result.append(intervals[0])
for i in range(1, len(intervals)):
if result[-1][1] >= intervals[i][0]:
result[-1][1] = max(intervals[i][1], result[-1][1])
else:
result.append(intervals[i])
return result
leetcode 738 单调递增的数字
本题的关键在于如何找出这个数字,以98来举例,num[i - 1] > num[i] 那么num- 1] - 1在
num[i - 1]之后填充9
class Solution:
def monotoneIncreasingDigits(self, n: int) -> int:
strNum = str(n)
flag = len(strNum)
for i in range(len(strNum) - 1, 0, -1):
if strNum[i - 1] > strNum[i]:
flag = i
strNum = strNum[:i - 1] + str(int(strNum[i - 1]) - 1) + strNum[i:]
for i in range(flag, len(strNum)):
strNum = strNum[:i] + '9' + strNum[i + 1:]
return int(strNum)
leetcode 968 监控二叉树
二叉树首先分析遍历方式,本题采用后序遍历,其次分析逻辑,本题考虑用3个数字代表三种状态,再分析各种情况,最后总结归纳。
class Solution:
def minCameraCover(self, root: Optional[TreeNode]) -> int:
result = [0]
if self.traversal(root, result) == 0:
result[0] += 1
return result[0]
def traversal(self, cur, result):
if not cur:
return 2
left = self.traversal(cur.left, result)
right = self.traversal(cur.right, result)
if left == 2 and right == 2:
return 0
if left == 0 or right == 0:
result[0] += 1
return 1
if left == 1 or right == 1:
return 2