贪心系列专题篇三

news2024/9/20 9:19:35

目录

单调递增的数字

坏了的计算器

合并区间

无重叠区间

用最少数量的箭


声明:接下来主要使用贪心法来解决问题!!!

单调递增的数字

题目

思路

如果我们遍历整个数组,然后对每个数k从[k,0]依次遍历寻找“单调递增”的数字,对于本题数据量最大为10^9,显然是会超时的,下面将介绍一种贪心解法。

把数字转换成字符串,然后从头到尾遍历整个字符串,当遇到后一个字符小于当前一个字符时,把当前字符-1,之后的字符全都修改正字符'9'。如下:

但是这种方法还是有缺陷的,比如下面的这种情况,

因此,我们需要对上面的贪心策略进行修改,修改后的贪心策略如下:

贪心策略

把数字转换成字符串,然后从头到尾遍历整个字符串,当遇到后一个字符小于当前一个字符时,向前寻找和当前字符相等的字符,把与当前字符相等的字符的最左段字符字符-1,之后的字符全都修改正字符'9'。如下:

代码

class Solution {
public:
    int monotoneIncreasingDigits(int n) {
        string s=to_string(n);
        int m=s.size();
        int i=0;
        while(i+1<m && s[i]<=s[i+1])
            i++;
        if(i+1==m) return n;
        else{
            while(i-1>=0 && s[i-1]==s[i])
                i--;
            s[i]=s[i]-1;
            for(i=i+1;i<m;i++)
                s[i]='9';
        }
        return stoi(s);
    }
};
坏了的计算器

题目

思路

因为可对startValue进行乘2和减1操作,但是要想由startValue变换成target,毫无确定的头绪可言.

贪心策略

采用“正难则反”的思想,我们可以想想如何将target变换成startValue,此时有两种操作,分别为除2和加1,而此时可以分两种情况进行讨论,分别是:

当target<startValue,当target为奇数时,由于startValue为整数,此时只能进行+1操作;

                            当target为偶数时,要想变换成startValue,此时只能进行+1操作,

即当target<startValue时,变换操作次数为startValue-target.

当target>startValue,当target为奇数时,由于startValue为整数,此时只能进行+1操作;

                            当target为偶数时,要想变换成startValue,可进行除2和+1操作混合进行,但是如果混合操作进行的话,要想让target变换成startValue,此时的操作次数是大于只进行除2操作的,因此此时只进行除2操作,

即当target>startValue时,先判断target的奇偶性,进行对应操作,直到target=startValue,或者target<startValue,然后进行target<startValue对应的规则。

代码

class Solution {
public:
    int brokenCalc(int startValue, int target) {
        long long ret=0;
        while(startValue<target){
            if(target%2==0) target/=2;
            else target+=1;
            ret++;
        }
        ret+=startValue-target;
        return ret;
    }
};
合并区间

题目

思路

首先我们先对集合按区间左端点进行排序,因为如果不排序的话,比较两个区间左端点的大小是需要不断遍历集合的,对集合按区间左端点进行排序后的情况如下:

基准参考区间的左端点记为left,右端点记为right,后一段区间的左端点记为a,右端点记为b。

贪心策略

对于a<=right的区间,需要进行合并,此时需要进行right=max(right,b)的操作即可;

对于a>right的区间, 不需要进行合并, 此时需要进行left=a,right=b和记录已合并区间的操作即可。

但是最后还需要记录最后一个区间。

代码

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        int n=intervals.size();
        sort(intervals.begin(),intervals.end());
        vector<vector<int>> ret;
        int left=intervals[0][0],right=intervals[0][1];
        for(int i=1;i<n;i++){
            int a=intervals[i][0],b=intervals[i][1];
            if(right>=a)
                right=max(right,b);
            else{
                ret.push_back({left,right});
                left=a,right=b;
            }
        }
        ret.push_back({left,right});
        return ret;
    }
};
无重叠区间

题目

思路

首先我们先对集合按区间左端点进行排序,因为如果不排序的话,比较两个区间左端点的大小是需要不断遍历集合的,对集合按区间左端点进行排序后的情况如下:

基准参考区间的左端点记为left,右端点记为right,后一段区间的左端点记为a,右端点记为b。

贪心策略

题目要求保证无重复区间需要删除区间的最少数量,等价于尽可能保留更过数量的区间,使用一个变量ret统计删除区间的数量。

对于a<=right的区间,需要进行删除一个右端点较大的那个区间,此时需要进行right=min(right,b)和ret++的操作即可;

对于a>right的区间, 只需要进行right=b的操作即可。

代码

class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        int n=intervals.size();
        sort(intervals.begin(),intervals.end());
        int ret=0;
        int right=intervals[0][1];
        for(int i=1;i<n;i++){
            int a=intervals[i][0],b=intervals[i][1];
            if(a<right){
                ret++;
                right=min(right,b);
            }
            else
                right=b;
        }
        return ret;
    }
};
用最少数量的箭引爆气球

题目

思路

首先我们先对集合按区间左端点进行排序,因为如果不排序的话,比较两个区间左端点的大小是需要不断遍历集合的,对集合按区间左端点进行排序后的情况如下:

基准参考区间的左端点记为left,右端点记为right,后一段区间的左端点记为a,右端点记为b。

这道题不同于前两道题的明显之处是前两道题求的是并集,而本道题求的是交集。

即求的是下面第二张图的交集个数,而非第一张图。

使用变量ret记录重叠区间个数。

贪心策略

当a<=right时,进行操作right=min(right,b)即可;

当a>right时,进行操作right=b,ret++即可。

代码

class Solution {
public:
    int findMinArrowShots(vector<vector<int>>& points) {
        int n=points.size();
        sort(points.begin(),points.end());
        int ret=0;
        int right=points[0][1];
        for(int i=1;i<n;i++){
            int a=points[i][0],b=points[i][1];
            if(a<=right)
                right=min(right,b);
            else
                right=b,ret++;
        }
        ret++;
        return ret;
    }
};

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

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

相关文章

人力资源专家推荐:2024年十大HR软件

本篇文章介绍了以下人力资源管理工具&#xff1a;Moka、北森云计算、友人才、人瑞人才、Zoho People、金蝶之家、Gusto、Workday HCM、Namely、UKG Pro。 在选择合适的人力资源软件时&#xff0c;许多企业常常面临各种挑战&#xff0c;例如如何确保软件功能全面、用户体验良好&…

WinForm中使用Bitmap元素处理图像

前言 这个Bitmap元素在我们处理图像显示相关时&#xff0c;它的身影就可以见到了。官方术语&#xff1a;封装 GDI 位图&#xff0c;此位图由图形图像及其属性的像素数据组成。 Bitmap 是用于处理由像素数据定义的图像的对象。操作对象最重要的两个方法GetPixel和SetPixel。 一…

vscode+cmake+msys2工具链配置

1、msys2下载编译器和cmake工具 pacman -S mingw-w64-x86_64-toolchain pacman -S mingw-w64-x86_64-cmaketoolchain包中包含很多不必要的包&#xff0c;应该可以指定具体的工具g&#xff0c;gcc&#xff0c;mingw32-make的下载&#xff0c;详细命令请自行搜索。 2、将 msys2…

前端面试宝典【HTML篇】【3】

欢迎来到《前端面试宝典》,这里是你通往互联网大厂的专属通道,专为渴望在前端领域大放异彩的你量身定制。通过本专栏的学习,无论是一线大厂还是初创企业的面试,都能自信满满地展现你的实力。 核心特色: 独家实战案例:每一期专栏都将深入剖析真实的前端面试案例,从基础知…

开源=最强大模型!Llama3.1发布,405B超越闭源GPT-4o,扎克伯格:分水岭时刻

刚刚&#xff0c;LIama 3.1正式发布&#xff0c;登上大模型王座&#xff01; 在150多个基准测试集中&#xff0c;405B版本的表现追平甚至超越了现有SOTA模型GPT-4o和Claude 3.5 Sonnet。 也就是说&#xff0c;这次&#xff0c;最强开源模型即最强模型。 在此之前&#xff0c;…

零基础入门转录组数据分析——机器学习算法之xgboost(筛选特征基因)

零基础入门转录组数据分析——机器学习算法之xgboost&#xff08;筛选特征基因&#xff09; 目录 零基础入门转录组数据分析——机器学习算法之xgboost&#xff08;筛选特征基因&#xff09;1. xgboost基础知识2. xgboost&#xff08;Rstudio&#xff09;——代码实操2. 1 数据…

第N高的薪水 [sql]

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT BEGINset N N - 1;RETURN (# Write your MySQL query statement below.select distinct salary from Employee order by salary desc limit 1 offset N); END

VSCode使用conda虚拟环境配置

如何解决CondaError: Run ‘conda init‘ before ‘conda activate‘_condaerror: run conda init before conda activat-CSDN博客 首先检查自己的anaconda是否是添加到整个的环境变量里了 打开cmd如果conda和python都能够识别那么就是配置成功了 然后看插件是否安装&#xf…

1个惊艳的Python项目火出圈,已开源,10K stars!

本次分享一个Python工具Taipy:“To build data & AI web applications in no time”。 Taipy专为数据科学家和机器学习工程师设计,用于构建数据和AI的Web应用程序。 快速构建可投入生产的Web应用程序。无需学习HTML、CSS、JS等新前端语言,只需使用Python。专注于数据和A…

抖音短视频矩阵系统优势:为何选择短视频矩阵系统?

1. 抖音短视频矩阵系统 抖音短视频矩阵系统&#xff0c;是指通过抖音平台&#xff0c;以矩阵的形式进行短视频创作、发布和传播的一种模式。它以多样化的内容、丰富的表现形式、高度的专业化和协同性&#xff0c;吸引了大量用户和创作者的关注。 2. 短视频矩阵系统的优势 2.…

jdk和tomcat的环境配置以及使用nginx代理tomcat来实现负载均衡

目录 1.jdk环境配置 1.jdk下载 2.解压 3.将jdk-22.2移动到指定目录/usr/local/jdk22/下 4.配置文件 5.运行profile 6.测试 2.tomcat环境配置 1.下载tomcat 2.解压 3.将解压后的文件移动指定目录 4.启动tomcat 5.查看端口确定是否确定成功 6.测试 7.tomcat目录 1…

<数据集>航拍人车识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;9695张 标注数量(xml文件个数)&#xff1a;9695 标注数量(txt文件个数)&#xff1a;9695 标注类别数&#xff1a;4 标注类别名称&#xff1a;[car, pedestrian, truck, bus] 序号类别名称图片数框数1car923525710…

GIT如何将远程指定分支的指定提交拉回到本地分支

一、当前我的代码在这个提交&#xff0c;但可以看到远程仓库上面还有两次新的提交 二、现在我想让我本次的代码更新到最上面这个最新的提交 三、输入git fetch命令获取远程分支的最新提交信息。 四、输入 git log origin/<remote_branch_name>查看并找到想要更新的指定提…

Reat hook开源库推荐

Channelwill Hooks 安装 npm i channelwill/hooks # or yarn add channelwill/hooks # or pnpm add channelwill/hooksAPI 文档 工具 Hooks useArrayComparison: 比较两个数组的变化。useCommunication: 处理组件之间的通信。useCurrencyConverter: 货币转换工具。useCurre…

【SRC挖掘】众测下的SQL注入挖掘案例

众测下的SQL注入挖掘 众测下的SQL注入挖掘0x01原理&#xff1a;0x02测试方法&#xff1a;常用手法&#xff1a;注入存在点&#xff1a; 0x03案例&#xff1a;总结 众测下的SQL注入挖掘 0x01原理&#xff1a; sql注入的原理在这里就不在详细介绍了&#xff0c;我相信大多数师傅…

MySQL数据库 外键默认约束和action 基础知识【2】推荐

数据库就是储存和管理数据的仓库&#xff0c;对数据进行增删改查操作&#xff0c;其本质是一个软件。MySQL就是一种开源的关系型数库&#xff0c;也是最受欢迎的数据库之一&#xff0c;今天对MySQL数据的基础知识做了整理&#xff0c;方便自己查看&#xff0c;也欢迎正在学习My…

DITA的优点和缺点

作者 | Stefan Jung DITA的实施可能是一项复杂的任务&#xff0c;本节列出了在实施DITA之前需要了解它的优缺点。 - 1 - 优点 开放标准 被很多公司采用 可以与版本控制系统一起使用&#xff0c;比如&#xff1a;Git 可扩展&#xff0c;可以从文件系统开始&#xff0c;稍后…

openGauss 5.0 LTS部署至华为云ECS CentOS8.2实操教程

一、前言 openGauss是一款高可靠、高性能、高安全、易运维的开源关系型数据库管理系统&#xff0c;然而其全功能部署对系统要求非常高。 本实操教程能够使个人开发者以及高校师生能够以成本最小的方式快速将openGauss部署到华为云的ECS上&#xff0c;以便快速进行功能验证以及…

C#(asp.net)电商后台管理系统-计算机毕业设计源码70015

摘 要 随着互联网技术的不断发展&#xff0c;电商行业也越来越受到人们的关注。为了提高电商行业的管理效率和服务水平&#xff0c;本文提出了一种基于ASP.NET电商后台管理系统的设计与实现方案。 电商管理系统基于VisualStudio开发平台&#xff0c;采用C#编程语言和ASP.NET等技…

使用 ModelScope 本地部署图片变视频模型

最近在抖音上看到很多视频可以让图片动起来&#xff0c;搜了一下&#xff0c;stabilityai/stable-video-diffusion-img2vid-xt 这个模型可以实现图片到视频&#xff0c;可以生成 25 帧的视频。Kling 和 Runway 都支持从图片生成视频&#xff0c;本文将通过 ModelScope 搭建一个…