首页 > 编程语言 >代码随想录算法训练营-贪心算法-5|56. 合并区间、738. 单调递增的数字、968. 监控二叉树

代码随想录算法训练营-贪心算法-5|56. 合并区间、738. 单调递增的数字、968. 监控二叉树

时间:2023-09-21 13:59:51浏览次数:34  
标签:right self 随想录 算法 二叉树 strNum left 节点 result

56. 合并区间

  • 时间复杂度: O(nlogn)
  • 空间复杂度: O(logn),排序需要的空间开销
 1 class Solution:
 2     def merge(self, intervals):
 3         result = []
 4         if len(intervals) == 0:
 5             return result  # 区间集合为空直接返回
 6 
 7         intervals.sort(key=lambda x: x[0])  # 按照区间的左边界进行排序
 8 
 9         result.append(intervals[0])  # 第一个区间可以直接放入结果集中
10 
11         for i in range(1, len(intervals)):
12             if result[-1][1] >= intervals[i][0]:  # 发现重叠区间
13                 # 合并区间,只需要更新结果集最后一个区间的右边界,因为根据排序,左边界已经是最小的
14                 result[-1][1] = max(result[-1][1], intervals[i][1])
15             else:
16                 result.append(intervals[i])  # 区间不重叠
17 
18         return result

738. 单调递增的数字

1. 给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。 2. 从后往前遍历,两位两位进行比较,第一位减1,第二位取最大。 3. flag:标记从哪一位开始后面都变成9。如果没有flag的话,例如1000,会得到900。flag初始值为数组长度-1,要不然样例本身就符合1234,会被9999覆盖。
 1 class Solution:
 2     def monotoneIncreasingDigits(self, N: int) -> int:
 3         # 将整数转换为字符串
 4         strNum = list(str(N))
 5 
 6         # 从右往左遍历字符串
 7         for i in range(len(strNum) - 1, 0, -1):
 8             # 如果当前字符比前一个字符小,说明需要修改前一个字符
 9             if strNum[i - 1] > strNum[i]:
10                 strNum[i - 1] = str(int(strNum[i - 1]) - 1)  # 将前一个字符减1
11                 # 将修改位置后面的字符都设置为9,因为修改前一个字符可能破坏了递增性质
12                 for j in range(i, len(strNum)):
13                     strNum[j] = '9'
14 
15         # 将列表转换为字符串,并将字符串转换为整数并返回
16         return int(''.join(strNum))

968. 监控二叉树

1. 四种情况。

 1 # Definition for a binary tree node.
 2 # class TreeNode:
 3 #     def __init__(self, val=0, left=None, right=None):
 4 #         self.val = val
 5 #         self.left = left
 6 #         self.right = right
 7 class Solution:
 8          # Greedy Algo:
 9         # 从下往上安装摄像头:跳过leaves这样安装数量最少,局部最优 -> 全局最优
10         # 先给leaves的父节点安装,然后每隔两层节点安装一个摄像头,直到Head
11         # 0: 该节点未覆盖
12         # 1: 该节点有摄像头
13         # 2: 该节点有覆盖
14     def minCameraCover(self, root: TreeNode) -> int:
15         # 定义递归函数
16         self.result = 0  # 用于记录摄像头的安装数量
17         if self.traversal(root, self.result) == 0:
18             self.result += 1
19 
20         return self.result
21 
22         
23     def traversal(self, cur: TreeNode, result: List[int]) -> int:
24         if not cur:
25             return 2
26 
27         left = self.traversal(cur.left, result)
28         right = self.traversal(cur.right, result)
29 
30         # 情况1: 左右节点都有覆盖
31         if left == 2 and right == 2:
32             return 0
33 
34         # 情况2:
35         # left == 0 && right == 0 左右节点无覆盖
36         # left == 1 && right == 0 左节点有摄像头,右节点无覆盖
37         # left == 0 && right == 1 左节点无覆盖,右节点有摄像头
38         # left == 0 && right == 2 左节点无覆盖,右节点覆盖
39         # left == 2 && right == 0 左节点覆盖,右节点无覆盖
40         if left == 0 or right == 0:
41             self.result += 1
42             return 1
43 
44         # 情况3:
45         # left == 1 && right == 2 左节点有摄像头,右节点有覆盖
46         # left == 2 && right == 1 左节点有覆盖,右节点有摄像头
47         # left == 1 && right == 1 左右节点都有摄像头
48         if left == 1 or right == 1:
49             return 2

 

标签:right,self,随想录,算法,二叉树,strNum,left,节点,result
From: https://www.cnblogs.com/wuyijia/p/17719161.html

相关文章

  • 124. 二叉树中的最大路径和
    二叉树中的路径被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中至多出现一次。该路径至少包含一个节点,且不一定经过根节点。路径和是路径中各节点值的总和。给你一个二叉树的根节点root,返回其最大路径和。示例1:输入:root=......
  • 文心一言 VS 讯飞星火 VS chatgpt (97)-- 算法导论9.3 3题
    三、用go语言,假设所有元素都是互异的,说明在最坏情况下,如何才能使快速排序的运行时间为O(nlgn)。文心一言:快速排序是一种基于分治策略的排序算法,其平均时间复杂度为O(nlgn)。在最坏情况下,快速排序的时间复杂度为O(n^2),这是因为当输入数组已经排序或接近排序时,快速排序的性能会退......
  • [代码随想录]Day50-单调栈part01
    题目:思路:要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了维护一个栈顶->栈底由小到大的栈;这样在之后(右侧)遇到更大的数时,就可以得到所有在他前面并且比他小的数,就能获得结果。初始化默认为0;代码:funcdailyTemperatures(n......
  • 深信服24届秋招算法:所有可能的出栈顺序
    publicclassMain{privatestaticfinalScannerin=newScanner(System.in);publicstaticvoidmain(String[]args)throwsUnsupportedEncodingException{//echo();Strings="abcdef";char[]seq=s.toCharArray......
  • 分治算法
    基本思想:将序列分为\([l,mid]\)和\([mid+1,r]\),然后递归两边,同时再计算\([l,mid]\)与\([mid+1,r]\)影响所产生的答案(满足单调性的话一般使用走指针)。二维偏序首先将所有元素按\(x,y\)排序。然后递归两边,随后用两个指针\(i\)和\(j\),\(i\)从\(l\)到\(mid\),\(j\)......
  • 基于FasterRCNN深度学习网络的车辆检测算法matlab仿真
    1.算法运行效果图预览 Tttttttttttttt123   2.算法运行软件版本MATLAB2022A 3.算法理论概述       车辆检测是计算机视觉和人工智能领域的重要研究方向,它在交通管理、智能驾驶和安防等领域具有广泛的应用。FasterR-CNN是一种常用的目标检测算法,结合了深度......
  • 随想录Day1|704. 二分查找、27. 移除元素
    随想录Day1|704.二分查找、27.移除元素 704.二分查找LeetCode题目文章讲解视频讲解给定n个元素升序的整形数组nums和一个目标值target,写一个函数搜索nums中的target,如果存在目标值则返回下标,否则返回-1。其中nums中的元素不重复,n在[1,10000]之间,nums的每个元素都在[-......
  • 6.1 KMP算法搜索机器码
    KMP算法是一种高效的字符串匹配算法,它的核心思想是利用已经匹配成功的子串前缀的信息,避免重复匹配,从而达到提高匹配效率的目的。KMP算法的核心是构建模式串的前缀数组Next,Next数组的意义是:当模式串中的某个字符与主串中的某个字符失配时,Next数组记录了模式串中应该回退到哪个位置,以......
  • 6.1 KMP算法搜索机器码
    KMP算法是一种高效的字符串匹配算法,它的核心思想是利用已经匹配成功的子串前缀的信息,避免重复匹配,从而达到提高匹配效率的目的。KMP算法的核心是构建模式串的前缀数组Next,Next数组的意义是:当模式串中的某个字符与主串中的某个字符失配时,Next数组记录了模式串中应该回退到哪个位置,以......
  • R语言RStan MCMC:NUTS采样算法用LASSO 构建贝叶斯线性回归模型分析职业声望数据|附代码
    原文链接:http://tecdat.cn/?p=24456原文出处:拓端数据部落公众号最近我们被客户要求撰写关于RStan的研究报告,包括一些图形和统计输出。如果你正在进行统计分析:想要加一些先验信息,最终你想要的是预测。所以你决定使用贝叶斯。但是,你没有共轭先验。你可能会花费很长时间编写Metr......