【贪心算法篇】:“贪心”之旅--算法练习题中的智慧与策略(三)

✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨
✨ 个人主页:余辉zmh–CSDN博客
✨ 文章所属专栏:贪心算法篇–CSDN博客

在这里插入图片描述

文章目录

  • 前言
  • 例题
    • 1.最优除法
    • 2.跳跃游戏2
    • 3.跳跃游戏1
    • 4.加油站
    • 5.单调递增的数字
    • 6.坏了的计算器

前言

本篇文章是对贪心算法练习题的讲解,有关贪心算法的讲解可以看本系列的第一篇文章,这里就不再讲解,继续讲解相关练习题。

例题

1.最优除法

题目

在这里插入图片描述

算法原理

在这里插入图片描述

代码实现

string optimalDivision(vector<int>& nums){
    //先处理个数小于等于2的情况
    if(nums.size()==1){
        return to_string(nums[0]);
    }
    if(nums.size()==2){
        return to_string(nums[0]) + '/' + to_string(nums[1]);
    }

    string ret;
    //只在第一个数后面加上(,最后一个数后面加上)
    for (int i = 0; i < nums.size(); i++){
        ret += to_string(nums[i]);
        if(i==0){
            ret += "/(";
        }
        else if(i==nums.size()-1){
            ret += ')';
        }
        else{
            ret += '/';
        }
    }
    return ret;
}

2.跳跃游戏2

题目

在这里插入图片描述

算法原理

本道题和下一道题跳跃游戏1的区别就是,本题要求统计最小跳跃次数,有就返回,没有就返回-1;下面图片中讲解本道题的贪心策略。

在这里插入图片描述

代码实现

int jump(vector<int>& nums){
    //左指针表示当前位置可以跳的最左位置,也就是跳的最小的步数位置
    //右指针和maxpos指针表示当前位置可以跳的最右位置,也就是跳的最大的步数位置
    int left = 0, right = 0, maxpos = 0;
    int n = nums.size();
    int ret = 0;

    //循环条件,当出现左指针大于右指针,结束,表示不能跳到最终位置
    while(left<=right){
        //如果maxpos指针的位置大于等于数组的长度,结束
        if(maxpos>=n-1){
            return ret;
        }

        //从当前左指针位置遍历到右指针位置,更新下一次可以跳到的最右位置
        for (int i = left; i <= right; i++){
            maxpos = max(maxpos, nums[i] + i);
        }

        //左指针更新为当前右指针的下一个,表示最少跳一步
        left=right+1;
        //右指针更新为maxpos指向的位置,表示最多跳的步数
        right = maxpos;

        ret++;
    }

    return -1;
}

3.跳跃游戏1

题目

在这里插入图片描述

算法原理

相较于上一个题,本道题的贪心策略还是相同,只不过最后的返回结果不同,本道题相对简单只需判断能否到达最终位置,能就返回true,不能就返回false。

代码实现

bool canJump(vector<int>& nums){
    //和跳跃游戏2相同,只是返回结果不同
    int left = 0, right = 0, maxpos = 0;
    int n=nums.size();

    while(left<=right){
        if(maxpos>=n-1){
            return true;
        }

        for (int i = left; i <= right; i++){
            maxpos = max(maxpos, nums[i] + i);
        }

        left=right+1;
        right = maxpos;
    }

    return false;
}

4.加油站

题目

在这里插入图片描述

在这里插入图片描述

算法原理

本道题其实就是在暴力枚举的基础上利用贪心的思想处理一些没必要的情况,直接看下面图片中的讲解即可。

在这里插入图片描述

代码实现

int canCompleteCircuit(vector<int>& gas, vector<int>& cost){
    int n = gas.size();
    //枚举所有的起始位置
    for (int i = 0; i < n; i++){
        //净收益
        int rest = 0;
        //步数
        int step=0;
        for (; step < n; step++){
            //下一步的位置
            int index = (i + step) % n;
            rest = rest + gas[index] - cost[index];
            if(rest<0){
                break;
            }
        }
        if(rest>=0){
            return i;
        }
        //这里是贪心的思想,从小于0的下一个位置开始从新作为起始位置
        i += step;
    }

    return -1;
}

5.单调递增的数字

题目

在这里插入图片描述

算法原理

本道题的贪心策略:找到第一个下降的数位,比如123452678中,5的下一个是2,5到2下降,第一个下降的数位就是5,因为只能减小,不能变大,如果把2修改成比5大的,就会导致该数变大,所以只能修改下降数位前面的数字,不能修改下降数位后的数字,5的前面是4,可以将5修改成4,然后后面其余的数全部修改成9,当前就变成123449999,比修改前的小,但是是能修改成的最大的数。

这里就有一个细节点,可能会出现这种情况123442678,第一个下降的数位是4,4的前面还是4,如果修改成1123439999,依然不是递增的,所以,如果下降数位前面有相同的数,要一直向前找,直到找到不同的数修改,这里的正确修改就是123339999,将两个4都修改。

代码实现

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;
    }

    //找到递减位置,向前找到最左侧相同值的位置
    while(i-1>=0&&s[i]==s[i-1]){
        i--;
    }

    //第一个相同值-1,其余位置全部修改成9
    s[i] = s[i] - 1;
    for (int j = i + 1; j < m; j++){
        s[j] = '9';
    }

    //修改完后转化成数字返回
    return stoi(s);
}

6.坏了的计算器

题目

在这里插入图片描述

算法原理

本道题首先用到的是正难则反思想,正着来是从初始值经过多次减法或者双倍乘法到目标值,而反着来就是从目标值经过多次加法或者二倍除法变成初始值。

因为本道题的数都是正整数,不会出现小数的情况,对于当前数原本有两种情况可以选择,一种是加1,一种是除2;而如果是奇数的话,就只能选择加1,因为除2就会出现小数的情况;而如果是偶数的情况两种情况都可以选择,但是这里用到了贪心的思想,优先选择除2,证明:假设当前数是n,如果先经过k次加1,再除2,最后结果就是(n+k)/2,相当于经过(k+1)次;如果先除2就变成n/2,再加上k/2就变成最后结果(n+k)/2,相当于经过2/k+1次,次数较少,所以优先选择除2。

代码实现

int brokenCalc(int startValue, int target){
    //正难则反思想,目标值除法或者加法变成初始值

    int ret = 0;
    while(target!=startValue){
        //如果目标值小于初始值,全选加法
        if(target<startValue){
            ret += (startValue - target);
            break;
        }
        //如果大于
        else{
            //如果目标值是奇数,选加法
            if(target%2==1){
                target += 1;
            }
            //如果是偶数,优先选除法
            else{
                target /= 2;
            }
            ret++;
        }
    }
    
    return ret;
}

以上就是关于贪心算法练习题三的讲解,如果哪里有错的话,可以在评论区指正,也欢迎大家一起讨论学习,如果对你的学习有帮助的话,点点赞关注支持一下吧!!!
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

什么是物理地址,什么是虚拟地址?

摘要 什么是物理地址&#xff0c;什么是虚拟地址&#xff1f; 如果处理器没有MMU或未启用&#xff0c;CPU执行单元发出的内存地址直接传到芯片引脚上&#xff0c;被内存芯片接受&#xff0c;这称为物理地址&#xff08;Physical Addraress&#xff09; 如果处理器启用了MMU&a…

LabVIEW图片识别逆向建模系统

本文介绍了一个基于LabVIEW的图片识别逆向建模系统的开发过程。系统利用LabVIEW的强大视觉处理功能&#xff0c;通过二维图片快速生成对应的三维模型&#xff0c;不仅降低了逆向建模的技术门槛&#xff0c;还大幅提升了建模效率。 ​ 项目背景 在传统的逆向建模过程中&#xf…

小程序的协同工作与发布

1.小程序API的三大分类 2.小程序管理的概念&#xff0c;以及成员管理两个方面 3.开发者权限说明以及如何维护项目成员 4.小程序版本

Unity 粒子特效在UI中使用裁剪效果

1.使用Sprite Mask 首先建立一个粒子特效在UI中显示 新建一个在场景下新建一个空物体&#xff0c;添加Sprite Mask组件&#xff0c;将其的Layer设置为UI相机渲染的UI层&#xff0c; 并将其添加到Canvas子物体中&#xff0c;调整好大小&#xff0c;并选择合适的Sprite&#xff…

Java设计模式:行为型模式→状态模式

Java 状态模式详解 1. 定义 状态模式&#xff08;State Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许对象在内部状态改变时改变其行为。状态模式通过将状态需要的行为封装在不同的状态类中&#xff0c;实现对象行为的动态改变。该模式的核心思想是分离不同状态…

中间件的概念及基本使用

什么是中间件 中间件是ASP.NET Core的核心组件&#xff0c;MVC框架、响应缓存、身份验证、CORS、Swagger等都是内置中间件。 广义上来讲&#xff1a;Tomcat、WebLogic、Redis、IIS&#xff1b;狭义上来讲&#xff0c;ASP.NET Core中的中间件指ASP.NET Core中的一个组件。中间件…

泰山派Linux环境下自动烧录脚本(EMMC 2+16G)

脚本名字&#xff1a; download.sh 输入./download -h获取帮助信息 &#xff0c;其中各个IMG/TXT烧录的地址和路径都在前几行修改即可 #!/bin/bash# # DownLoad.sh 多镜像烧录脚本 # 版本&#xff1a;1.1 # 作者&#xff1a;zhangqi # 功能&#xff1a;通过参数选择烧录指定镜…

使用开源项目:pdf2docx,让PDF转换为Word

目录 1.安装python 2.安装 pdf2docx 3.使用 pdf2docx 转换 PDF 到 Word pdf2docx&#xff1a;GitCode - 全球开发者的开源社区,开源代码托管平台 环境&#xff1a;windows电脑 1.安装python Download Python | Python.org 最好下载3.8以上的版本 安装时记得选择上&#…

一、TensorFlow的建模流程

1. 数据准备与预处理&#xff1a; 加载数据&#xff1a;使用内置数据集或自定义数据。 预处理&#xff1a;归一化、调整维度、数据增强。 划分数据集&#xff1a;训练集、验证集、测试集。 转换为Dataset对象&#xff1a;利用tf.data优化数据流水线。 import tensorflow a…

设计模式 - 行为模式_Template Method Pattern模板方法模式在数据处理中的应用

文章目录 概述1. 核心思想2. 结构3. 示例代码4. 优点5. 缺点6. 适用场景7. 案例&#xff1a;模板方法模式在数据处理中的应用案例背景UML搭建抽象基类 - 数据处理的 “总指挥”子类定制 - 适配不同供应商供应商 A 的数据处理器供应商 B 的数据处理器 在业务代码中整合运用 8. 总…

计算图 Compute Graph 和自动求导 Autograd | PyTorch 深度学习实战

前一篇文章&#xff0c;Tensor 基本操作5 device 管理&#xff0c;使用 GPU 设备 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started PyTorch 计算图和 Autograd 微积分之于机器学习Computational Graphs 计算图Autograd…

C++11详解(一) -- 列表初始化,右值引用和移动语义

文章目录 1.列表初始化1.1 C98传统的{}1.2 C11中的{}1.3 C11中的std::initializer_list 2.右值引用和移动语义2.1左值和右值2.2左值引用和右值引用2.3 引用延长生命周期2.4左值和右值的参数匹配问题2.5右值引用和移动语义的使用场景2.5.1左值引用主要使用场景2.5.2移动构造和移…

Spring Boot常用注解深度解析:从入门到精通

今天&#xff0c;这篇文章带你将深入理解Spring Boot中30常用注解&#xff0c;通过代码示例和关系图&#xff0c;帮助你彻底掌握Spring核心注解的使用场景和内在联系。 一、启动类与核心注解 1.1 SpringBootApplication 组合注解&#xff1a; SpringBootApplication Confi…

生成式AI安全最佳实践 - 抵御OWASP Top 10攻击 (下)

今天小李哥将开启全新的技术分享系列&#xff0c;为大家介绍生成式AI的安全解决方案设计方法和最佳实践。近年来生成式 AI 安全市场正迅速发展。据IDC预测&#xff0c;到2025年全球 AI 安全解决方案市场规模将突破200亿美元&#xff0c;年复合增长率超过30%&#xff0c;而Gartn…

git:恢复纯版本库

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

蓝桥杯python基础算法(2-1)——排序

目录 一、排序 二、例题 P3225——宝藏排序Ⅰ 三、各种排序比较 四、例题 P3226——宝藏排序Ⅱ 一、排序 &#xff08;一&#xff09;冒泡排序 基本思想&#xff1a;比较相邻的元素&#xff0c;如果顺序错误就把它们交换过来。 &#xff08;二&#xff09;选择排序 基本思想…

python学opencv|读取图像(五十四)使用cv2.blur()函数实现图像像素均值处理

【1】引言 前序学习进程中&#xff0c;对图像的操作均基于各个像素点上的BGR值不同而展开。 对于彩色图像&#xff0c;每个像素点上的BGR值为三个整数&#xff0c;因为是三通道图像&#xff1b;对于灰度图像&#xff0c;各个像素上的BGR值是一个整数&#xff0c;因为这是单通…

Slint的学习

Slint是什么 Slint是一个跨平台的UI工具包&#xff0c;支持windows,linux,android,ios,web&#xff0c;可以用它来构建申明式UI,后端代码支持rust,c,python,nodejs等语言。 开源地址&#xff1a;https://github.com/slint-ui/slint 镜像地址&#xff1a;https://kkgithub.com/…

惰性函数【Ⅱ】《事件绑定的自我修养:从青铜到王者的进化之路》

【Ⅱ】《事件绑定的自我修养&#xff1a;从青铜到王者的进化之路》 1. 代码功能大白话&#xff08;给室友讲明白版&#xff09; // 青铜写法&#xff1a;每次都要问浏览器"你行不行&#xff1f;" function addEvent青铜版(element, type, handler) {if (window.add…

Unity飞行代码 超仿真 保姆级教程

本文使用Rigidbody控制飞机&#xff0c;基本不会穿模。 效果 飞行效果 这是一条优雅的广告 如果你也在开发飞机大战等类型的飞行游戏&#xff0c;欢迎在主页搜索博文并参考。 搜索词&#xff1a;Unity游戏(Assault空对地打击)开发。 脚本编写 首先是完整代码。 using System.Co…