56.合并区间
也是一道重叠区间的问题,解决的大概思路就是先排序,按照左边界或右边界都可以;按照左边界从小到大排序之后,如果 intervals[i][0] <= intervals[i - 1][1] 即intervals[i]的左边界 <= intervals[i - 1]的右边界,则一定有重叠。(本题相邻区间也算重叠,所以是<=)
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
if len(intervals)==1:
return intervals
intervals.sort(key=lambda x:x[0])
unoverlapped=[intervals[0]]
for i in range(1,len(intervals)):
if unoverlapped[-1][1]>=intervals[i][0]:
unoverlapped[-1][1]=max(unoverlapped[-1][1],intervals[i][1])
else:
unoverlapped.append(intervals[i])
return unoverlapped
738.单调递增的数字
刚开始想的就是暴力算法,但是很明显会超时
class Solution:
def monotoneIncreasingDigits(self, n: int) -> int:
if self.judge(n) is True:
return n
while self.judge(n) is not True:
n-=1
return n
def judge(self,n):
str_n=str(n)
for num in range(1,len(str_n)):
if str_n[num-1]>str_n[num]:
return False
return True
所以在这里要根据题目的要求(单调递增)来知道:以两位数98举例:一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。
然后要想的事情是向后遍历还是向前遍历。对本题来说,向前遍历更合适,因为如果数字是三位数以上的数字,向前遍历可以利用上次遍历的结果。
class Solution:
def monotoneIncreasingDigits(self, n: int) -> int:
# 将整数转换为字符串
strNum = list(str(n))
# 从右往左遍历字符串
for i in range(len(strNum) - 1, 0, -1):
# 如果当前字符比前一个字符小,说明需要修改前一个字符
if strNum[i - 1] > strNum[i]:
strNum[i - 1] = str(int(strNum[i - 1]) - 1) # 将前一个字符减1
# 将修改位置后面的字符都设置为9,因为修改前一个字符可能破坏了递增性质
for j in range(i, len(strNum)):
strNum[j] = '9'
# 将列表转换为字符串,并将字符串转换为整数并返回
return int(''.join(strNum))
968.监控二叉树(华为机试第二题)
-----------------------------2025.5.18
没想到在这里遇到了...后悔刷题刷的晚了,二刷再做吧