day37【代码随想录】贪心算法之划分字母区间、合并区间、单调递增的数字、买卖股票的最佳时机含手续费、监控二叉树

news2025/1/17 0:14:07

文章目录

  • 前言
  • 一、划分字母区间(力扣763)
  • 二、合并区间(力扣56)
  • 三、单调递增的数字(力扣738)
  • 四、买卖股票的最佳时机含手续费(力扣714)
  • 五、监控二叉树(力扣968)


前言

1、划分字母区间
2、合并区间
3、单调递增的数字
4、买卖股票的最佳时机含手续费
5、监控二叉树


一、划分字母区间(力扣763)

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。

注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。

返回一个表示每个字符串片段的长度的列表。
在这里插入图片描述
思路:
在遍历的过程中相当于是要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。此时前面出现过所有字母,最远也就到这个边界了。

  • 统计每一个字符最后出现的位置
  • 从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点
    在这里插入图片描述
class Solution {
    public List<Integer> partitionLabels(String s) {
        List<Integer> res = new LinkedList<>();
        char[] chars = s.toCharArray();
        int[] edge = new int[26];
        for(int i=0;i<chars.length;i++){
            edge[chars[i]-'a']=i;
        }

        int idx = 0;
        int last = -1;
        for(int i=0;i<chars.length;i++){
            idx = Math.max(idx,edge[chars[i]-'a']);
            if(i==idx){
                res.add(i-last);
                last=i;
            }
        }
        return res;
    }
}

在这里插入图片描述

二、合并区间(力扣56)

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

在这里插入图片描述
思路:
在这里插入图片描述

class Solution {
    public int[][] merge(int[][] intervals) {

        List<int[]> res = new LinkedList<>();
        Arrays.sort(intervals,(a,b)->Integer.compare(a[0],b[0]));
        int start = intervals[0][0];
        int rightBound = intervals[0][1];
        for(int i=1;i<intervals.length;i++){
            if(intervals[i][0]>rightBound){ //不挨着
               res.add(new int[]{start,rightBound});
               start = intervals[i][0];
               rightBound = intervals[i][1];
            }
            else{//挨着,更新右边界
                rightBound = Math.max(rightBound,intervals[i][1]);
            }
        }
        res.add(new int[]{start,rightBound});
        return res.toArray(new int[res.size()][]);
    }
}

在这里插入图片描述

三、单调递增的数字(力扣738)

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

给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。
在这里插入图片描述
思路:
例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]–,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数

局部最优:遇到strNum[i - 1] > strNum[i]的情况,让strNum[i - 1]–,然后strNum[i]给为9,可以保证这两位变成最大单调递增整数。

是从前向后遍历还是从后向前遍历呢?

举个例子,数字:332,从前向后遍历的话,那么就把变成了329,此时2又小于了第一位的3了,真正的结果应该是299。
所以从前向后遍历会改变已经遍历过的结果!
那么从后向前遍历,就可以重复利用上次比较得出的结果了,从后向前遍历332的数值变化为:332 -> 329 -> 299

class Solution {
    public int monotoneIncreasingDigits(int N) {
        String s = String.valueOf(N);
        char[] chars = s.toCharArray();

        int start = chars.length;
        for(int i=start-2;i>=0;i--){
            if(chars[i]>chars[i+1]){
                chars[i]--;
                start = i+1;
            }
        }
        for(int i = start;i<chars.length;i++){
            chars[i]='9';
        }
        return Integer.parseInt(String.valueOf(chars));
    }
}

在这里插入图片描述

四、买卖股票的最佳时机含手续费(力扣714)

给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 ;整数 fee 代表了交易股票的手续费用。

你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。

返回获得利润的最大值。

注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。
思路:

  • 用两个变量,一个累加利润用,另一个保存当前最优成本
  • 当前成本即 -> 买入价格 + 手续费
  • 如果哪天价格比这个成本要高,就可以考虑在这天卖了,这时更新成本为当前的价格
  • 如果日后哪天价格更优,可以晚一会儿再卖嘛。
  • 当然,如果哪天的 价格 + 成本,要比手里的成本还低,那就在这天去买就好了。
  • 综上,这天卖不卖,不确定,能有利润我就先记上,以后要是有更高的,我把又涨了的利润也叠加进去,要是有更低的,我就当之前已经卖了,再买新的。只是模拟出利润最大化。
class Solution {
    public int maxProfit(int[] prices, int fee) {
        int buy = fee + prices[0];//成本即 -> 买入价格 + 手续费
        int res = 0;
        for(int i = 1;i<prices.length;i++){
            if(prices[i]+fee<buy){ //选一个买入价钱更小的
                buy = prices[i]+fee; //更新值
            }else if(prices[i]>buy){ //哪天价格比这个成本要高,就可以考虑在这天卖了
                res += prices[i]-buy; //利润相加
                buy = prices[i]; //更新成本为当前的价格
            }
        }
        return res;
    }
}

在这里插入图片描述

五、监控二叉树(力扣968)

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

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

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

在这里插入图片描述
在这里插入图片描述
思路:
确定遍历顺序:后序遍历(从低向上推导)
如何隔两个节点放一个摄像头

每个节点可能有三种状态:
该节点无覆盖:0
本节点有摄像头:1
本节点有覆盖:2

单层逻辑处理:
情况1:左右节点都有覆盖,那么此时中间节点应该就是无覆盖的状态了。
情况2:左右节点至少有一个无覆盖的情况,则中间节点(父节点)应该放摄像头
情况3:左右节点至少有一个有摄像头,其父节点就应该是2(覆盖的状态)
情况4:头结点没有覆盖

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int res = 0;
    public int minCameraCover(TreeNode root) {
        if(minCame(root)==0){ //情况四
            res++;
        }
        return res;
    }
    public int minCame(TreeNode root){
        if(root==null) return 2; //空结点默认有覆盖状态

        int left = minCame(root.left);
        int right = minCame(root.right);

        //情况一:
        if(left==2 && right==2) return 0;
        //情况二:
        else if(left==0 || right==0) {
            res++;
            return 1;
        }
        //情况三:
        else  return 2;
    }
}

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/162116.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1.14 IIC总线实验

一.IIC总线&#xff1a; 1.同步半双工串行总线&#xff0c;用于同一个开发板两个芯片之间的通信 2.有两根信号线&#xff0c;一根SDA,一根SCL 3.IIC总线需要外接两个上拉电阻&#xff0c;使空闲状态保持高电平 4.IIC总线支持多主机多从机模式&#xff0c;一般采用单主机多从…

STM32外部中断解析

文章目录前言一、外部中断是什么二、STM32F103的外部中断三、外部中断的中断号四、HAL库的外部中断初始化流程总结前言 本篇文章将带大家了解STM32F103的外部中断。 一、外部中断是什么 外部中断是单片机实时地处理外部事件的一种内部机制。当某种外部事件发生时&#xff0c…

数组名的意义

数组名只有单独放在sizeof内部以及放在&后才代表整个数组的地址。其余情况数组名都表示数组首元素地址。 之前我们说过用sizeof(a)计算的是整个数组的大小&#xff0c;现在我们知道其中的原因了。由于sizeof里的数组名a表示整个数组的地址&#xff0c;故sizeof(a)求的是整…

Android10以上系统Audio音频遇到播放无声时的分析方法

​商务合作 2023年招聘 2023年逆向分析资料汇总 推荐阅读 Android Audio音频系统 Android Audio音频系统之深入浅出 Android Framework/驱动/内核中高级工程师 ​Android10以上系统Audio音频遇到播放视频无声时的分析方法 干货|Android APP应用工程师转Framework工程师(…

51单片机存储结构

之前概要介绍了8151微控制器的结构&#xff08;也就是51单片机&#xff09;。相比微处理器&#xff0c;微控制器的区别之一是在一个芯片上有程序存储器(RAM)和数据存储器(RAM)。存储区是微控制器非常重要的内容。 本文就介绍一下8051的存储结构。包括存储器的组织、处理器对存储…

VTK-Tessellator Subdivision

前言&#xff1a;本博文主要研究Tessellator 的Subdivision&#xff0c;对vtk中的所有相关接口进行研究&#xff0c;并找出最优的解决方法。 GeometricObjects中vtkTessellatorFilter的应用实例 待研究对当前的Subdivision进行优化。 vtkTessellatorFilter 位置&#xff1a;…

Docker容器数据卷与数据卷容器

文章目录什么是容器数据卷使用数据卷使用 docker 安装 mysql匿名和具名挂载数据卷容器什么是容器数据卷 Docker理念回顾 将应用和运行的环境打包形成容器运行&#xff0c;运行可以伴随着容器&#xff0c;但是我们对于数据的要求&#xff0c;是希望能够 持久化的&#xff01; 就…

【寒假每日一题】DAY.6 有序序列的合并

牛客网例题&#xff1a;点我做题 描述 输入两个升序排列的序列&#xff0c;将两个序列合并为一个有序序列并输出。数据范围&#xff1a; 1 ≤ n&#xff0c;m ≤ 1000&#xff0c;序列中的值满足0≤val≤30000输入描述&#xff1a; 输入包含三行&#xff0c;第一行包含两个正整…

微信小程序开发起步

一、小程序与普通网页开发的区别 1&#xff09;运行环境不同。网页运行在浏览器环境中&#xff0c;小程序运行在微信环境中。 2&#xff09;API不同。由于运行环境不同&#xff0c;所以小程序中无法调用DOM和BOM的API&#xff0c;但是小程序可以调用微信环境提供的各种API&am…

zabbix的安装部署,一看就会

目录 1、系统组成 2、采集模式 3、监控类型 4、相关术语 5、安装部署 1、系统组成 2、采集模式 监控系统数据采集的工作模式可以分为 被动模式&#xff08;从服务器端到客户端采集数据&#xff0c;对应的英文单词是pull&#xff09; 主动模式 &#xff08;客户端主动上报…

java基于springboot的新生报到系统app新生报到安卓app新生入学报到小程序加论文

简介 本项目主要是新生报到系统&#xff0c;包含的新生入学流程的功能&#xff1a;新生可以在app里提交预报到日期确认报到&#xff0c;查看自己的学费缴费记录&#xff0c;更改自己的银行卡号&#xff0c;查看课表&#xff0c;查看寝室&#xff0c;查看自己的专业班级等个人信…

CubeMX配置:定时器中断及串口配置

本文通过CubeMX配置F103RCT6的定时器中断和串口。 文章目录1 引入2 配置过程2.1 配置时钟过程2.2 配置串口过程2.3 定时器中断配置3 生成工程代码4 测试串口及定时器中断周期5 总结1 引入 拿到一个STM32控制器&#xff0c;在啥也没有的情况下从零开始写软件&#xff0c;博主习…

Java K 个一组翻转链表

K 个一组翻转链表困难给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。你不能只是单纯的…

电视为何降价至200元依然没人买?爱奇艺给出了答案

近日爱奇艺提高降低会员的服务内容&#xff0c;消费者要享受到将内容投放到电视就要买更贵的会员服务&#xff0c;引发热议&#xff0c;此举或许能解释国内消费者为何如今不买电视了。2022年电视行业可谓是一个相当惨淡的行业&#xff0c;量价齐跌&#xff0c;随着2022年底的到…

计算机视觉OpenCv学习系列:第二部分、图像操作

第二部分、图像操作第一节、图像读取与显示1.图像理解2.图像读取与显示3.代码练习与测试第二节、图像色彩空间转换1.图像色彩空间2.函数说明与解释3.代码练习与测试第三节、图像对象的创建与赋值1.图像对象属性2.图像对象创建与赋值3.代码练习与测试第四节、图像像素的读写操作…

SpringBoot——关于controller参数校验

参数校验主要使用两个标签Validated和Valid&#xff1b; Valid是Hibernate的注解校验&#xff0c;Validated是spring的&#xff0c;是Valid的增强&#xff1b;这两个标签也有一些不同之处&#xff0c;Valid可以标注在成员属性上也可以嵌套校验&#xff0c;而Validated不行&…

Node.js 操作MySQL数据库

在讲Node.js中引入mysql模块之前先讲一下关于MySQL数据库&#xff0c;首先是关于MySQL数据库的安装和mysql服务以及对mysql命令和可视化工具的一个基本使用&#xff1b;那么在这里已经准备好了关于MySQL数据库的内容了&#xff1a; MySQL 数据库安装详细 &#xff1a; MySQL数…

redis主从复制,一主多仆启动流程

文章目录一、安装redis二、复制修改配置文件三、添加conf配置文件四、开启主从复制五、薪火相传六、反客为主7、哨兵模式一、安装redis redis安装笔记 https://blog.csdn.net/G_GUi/article/details/128361131 二、复制修改配置文件 把redis.conf复制到一个新建文件夹里面&a…

安卓手机还有这么多神仙玩法,关键只有少数人知道

随着“智能手机”的快速更新迭代&#xff0c;手机系统逐渐融入了许多实用功能&#xff1b;今年Android手机市场竞争相当激烈&#xff0c;各大手机品牌都争先恐后地向消费者展示自己的新机型。今天我就来给大家分享几个只有安卓手机才有的隐藏黑科技功能&#xff0c;每个功能都非…

cocos creator新手教程:第003节3D模型的基本概念

3.1 计算机如何制作一个3D模型 讲述这个问题之前&#xff0c;我们先来看下现实生活中我们要做一个模型&#xff0c;应该如何做呢&#xff1f;首先我们要把模型的形状给雕刻构建出来&#xff0c;现实生活中的物体都是由分子组成的连续的表面&#xff0c;计算机是离散的无法做到这…