首页 > 编程语言 >Day31 贪心算法part5

Day31 贪心算法part5

时间:2024-08-16 11:54:25浏览次数:10  
标签:result self nstr Day31 intervals part5 节点 摄像头 贪心

目录

任务

56. 合并区间

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

思路

按照左区间排序,判断重叠区间,扩展重叠区间(重叠时修改result,不重叠时扩展result)。

class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        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(intervals[i][1],result[-1][1])
            else:
                result.append(intervals[i])
        return result

738. 单调递增的数字

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

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

思路

从低位到高位依次比较,不满足要求时,高位-1,当前高位之后的低位都变成9。

class Solution:
    def monotoneIncreasingDigits(self, n: int) -> int:
        nstr = str(n)
        flag = len(nstr)
        
        for i in range(len(nstr)-2,-1,-1):
            if nstr[i+1] < nstr[i]:
                flag = i+1
                nstr = nstr[:i] + str(int(nstr[i])-1) + nstr[i+1:]
            
        for i in range(flag,len(nstr)):
            nstr = nstr[:i] + '9' + nstr[i+1:]
        
        return int(nstr)

968. 监控二叉树

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

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

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

思路

节点状态分为3种情况,0.无覆盖 1.有摄像头 2.有覆盖,遍历过程中给节点赋予正确的状态。 当节点是摄像头状态时,计数。

  • 为什么空节点的状态为2呢,这是因为我们不会在叶子节点放摄像头,而要在叶子节点的父节点放摄像头,如果默认空节点状态为0,则叶子节点必须为1,如果默认空节点状态为1,则叶子节点的父节点就不能放摄像头。所以空节点的状态设为2.
  • 注意根节点的特殊处理,即设置完状态后,如果根节点的状态是无覆盖,则还需要在根节点设置摄像头。
class Solution:
    def __init__(self) -> None:
        self.result = 0
    def minCameraCover(self, root: Optional[TreeNode]) -> int:
        if self.dfs(root) == 0:
            self.result+=1
        return self.result
        
    def dfs(self,node: Optional[TreeNode]): # 0.无覆盖 1.有摄像头 2.有覆盖
        if not node: return 2
        left = self.dfs(node.left)
        right = self.dfs(node.right)
        
        if left==2 and right==2: #1.左右孩子都有覆盖
            return 0
        if left==0 or right==0: #2.左右孩子至少有一个无覆盖
            self.result+=1
            return 1
        if left==1 or right==1: #3.左右孩子至少有一个有摄像头
            return 2
        return -1     #不会走到这里    

标签:result,self,nstr,Day31,intervals,part5,节点,摄像头,贪心
From: https://www.cnblogs.com/haohaoscnblogs/p/18362592

相关文章

  • 代码随想录 day31|| 56 合并区间,738 单调递增数字,968 监控二叉树
    56合并区间funcmerge(intervals[][]int)[][]int{ //思路先排序,然后按照后一个左区间和前一个右区间进行对比判断是否重叠,重叠扩充右区间 sort.Slice(intervals,func(i,jint)bool{ ifintervals[i][0]==intervals[j][0]{ returnintervals[i][1]<intervals[......
  • Day30 贪心算法part4
    目录任务452.用最少数量的箭引爆气球思路435.无重叠区间思路763.划分字母区间思路任务452.用最少数量的箭引爆气球有一些球形气球贴在一堵用XY平面表示的墙面上。墙面上的气球记录在整数数组points,其中points[i]=[xstart,xend]表示水平直径在xstart和xend之间的......
  • Day28 贪心算法part2
    任务122.买卖股票的最佳时机II给你一个整数数组prices,其中prices[i]表示某支股票第i天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候最多只能持有一股股票。你也可以先购买,然后在同一天出售。返回你能获得的最大利润。思路考虑分解最终......
  • 算法-贪心
    1.分发饼干(LeetCode455)假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子i,都有一个胃口值g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干j,都有一个尺寸s[j]。如果s[j]>=g[i],我们可以将这个饼干j分配给......
  • 可持久化可反悔贪心
    接到上级通知,贪心思路假了,紧急需要调整思路思路假了?考虑反悔while(思路==false){cout<<"思路假了"<<endl;思路=true;cout<<"改对了"<<endl;}SampleOutput思路假了改对了思路假了改对了思路假了改对了思路假了改对了思路假了改对了思路假了改对了......
  • 贪心法-一般背包问题
    一般背包问题问题描述想象你有一个背包,它最多可以放M公斤的物品。你面前有n个物品,每个物品的重量是Wi,如果将这个物品完全放入背包,你将获得Pi的收益。问题目标你需要决定如何放置这些物品,以便在不超过背包容量的前提下,获得最大的收益。问题类型0/1背包问题:每个......
  • Day27 贪心算法part1
    任务455.分发饼干假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子i,都有一个胃口值g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干j,都有一个尺寸s[j]。如果s[j]>=g[i],我们可以将这个饼干j分配给孩子i,这......
  • (day31)leecode热题——多数元素
    描述给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊n/2⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入:nums=[3,2,3]输出:3示例 2:输入:nums=[2,2,1,1,1,2,2]输出:2提示:n==......
  • 「代码随想录算法训练营」第三十二天 | 动态规划 part5
    52.携带研究材料题目链接:https://kamacoder.com/problempage.php?pid=1052文章讲解:https://programmercarl.com/背包问题理论基础完全背包.html视频讲解:https://www.bilibili.com/video/BV1uK411o7c9/题目状态:看题解过思路:在0-1背包问题中,每个物品只能选择一次,即每个物品......
  • 贪心
    有些题dp是难做的或做不了的,这个时候可以去设计一种策略使得决策尽可能最优,也就是贪心。可以说贪心有时候是一种乱搞,但乱搞也能搞出出题人想不到的正解。反悔贪心有些题中直接dp的复杂度很高并且很难优化或者有后效性无法dp,朴素贪心考虑可以做到\(O(n)\)但是无法保证正确......