合并区间

合并区间
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

示例 1:

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]

输出:[[1,6],[8,10],[15,18]]

解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入:intervals = [[1,4],[4,5]]

输出:[[1,5]]

解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

示例 3:

输入:intervals = [[4,7],[1,4]]

输出:[[1,7]]

解释:区间 [1,4] 和 [4,7] 可被视为重叠区间。

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
if len(intervals) <= 1 :
return intervals
result = []
intervals.sort(key = lambda x:x[0])
result.append(intervals[0])
for i in range(1,len(intervals)):
if intervals[i][0] <= result[-1][1]:
result[-1][1] = max(result[-1][1],intervals[i][1])
else :
result.append(intervals[i])
return result

首先设置初始数组为第一个区间(作为结果数组)

再判断重叠区间,重叠区间的判断条件是当前区间的起始位置小于等于结果数组中最后一个区间的结束位置。

如果重叠,则更新结果数组中最后一个区间的结束位置为两者的最大值。

如果不重叠,则将当前区间添加到结果数组中。

单调递增的数字

单调递增的数字
当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。

给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。

示例 1:

输入: n = 10

输出: 9

示例 2:

输入: n = 1234

输出: 1234

示例 3:

输入: n = 332

输出: 299

1
2
3
4
5
6
7
8
9
10
11
class Solution:
def monotoneIncreasingDigits(self, n: int) -> int:
strn = str(n)
flag = len(strn)
for i in range(len(strn)-1,0,-1): #因为后续用i-1和i比较,不包含第一个来防止越界访问
if strn[i-1] > strn[i]:
flag = i
strn = strn[0:i-1]+str(int(strn[i-1])-1)+strn[i:]
for i in range(flag,len(strn)):
strn = strn[:i] + "9" + strn[i+1:]
return int(strn)

首先将整数转换为字符串以便逐位处理。

从右向左遍历字符串,找到第一个不满足单调递增条件的位置i。

将该位置的数字减1,并将该位置后面的所有数字都设为9。

将处理后的字符串转换为整数并返回。

监控二叉树

监控二叉树
给定一个二叉树,我们在树的节点上安装摄像头。

节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。

计算监控树的所有节点所需的最小摄像头数量。

题目示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:

# 0:未覆盖 1:有摄像头 2:有覆盖
def minCameraCover(self, root: Optional[TreeNode]) -> int:
self.result = 0
if self.dfs(root,self.result) == 0:
self.result += 1
return self.result
def dfs(self,cur,result):
if cur == None:
return 2
left = self.dfs(cur.left,self.result)
right = self.dfs(cur.right,self.result)
if left == 2 and right == 2:
return 0
if left == 0 or right == 0 :
self.result += 1
return 1
if left == 1 or right == 1 :
return 2

首先要给每个节点设置状态,0:未覆盖 1:有摄像头 2:有覆盖

并让叶子节点的子节点设置为2(有覆盖),因为叶子节点没有子节点,所以设置为0(未覆盖)。

如果一个节点的左右子节点都是2(有覆盖),那么该节点就是0(未覆盖)。

如果一个节点的左右子节点有一个是0(未覆盖),那么该节点就是1(有摄像头)()优先级比下面的高。

如果一个节点的左右子节点都是1(有摄像头),那么该节点就是2(有覆盖)。

还有第四种情况就是到根节点了,并设置为未覆盖,但是根节点可没有父节点,因此要改为1(有摄像头)。