当前位置: 首页 > news >正文

【贪心算法】No.1---贪心算法(1)

文章目录

  • 前言
  • 一、贪心算法:
  • 二、贪心算法示例:
    • 1.1 柠檬⽔找零
    • 1.2 将数组和减半的最少操作次数
    • 1.3 最⼤数
    • 1.4 摆动序列
    • 1.5 最⻓递增⼦序列
    • 1.6 递增的三元⼦序列


前言

在这里插入图片描述

👧个人主页:@小沈YO.
😚小编介绍:欢迎来到我的乱七八糟小星球🌝
📋专栏:贪心算法
🔑本章内容:贪心算法
记得 评论📝 +点赞👍 +收藏😽 +关注💞哦~


一、贪心算法:

贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。贪心算法解决问题的过程中,每一步都做出一个看似最优的决策,这个决策依赖于当前问题状态,不依赖于解决问题的前面的步骤和将来的步骤。这种方法在很多情况下并不会得到最优解,但是在某些问题上贪心算法的解就是最优解。

二、贪心算法示例:

1.1 柠檬⽔找零

  1. 题⽬链接:860. 柠檬⽔找零
  2. 题⽬描述
    在这里插入图片描述
  3. 解法(贪⼼):
    贪⼼策略:
    分情况讨论:
    a. 遇到 5 元钱,直接收下;
    b. 遇到 10 元钱,找零 5 元钱之后,收下;
    c. 遇到 20 元钱:
    i. 先尝试凑 10 + 5 的组合;
    ii. 如果凑不出来,拼凑 5 + 5 + 5 的组合;
  4. C++代码
class Solution {
public:bool lemonadeChange(vector<int>& bills) {int five=0,ten=0;for(int i=0;i<bills.size();i++){if(bills[i]==5)five++;else if(bills[i]==10){ten++;if(five>0)five--;else return false;}else{if(ten>0&&five>0)//贪心{ten--;five--;}else if(five>=3)five-=3;else return false;}}return true;}
};

1.2 将数组和减半的最少操作次数

  1. 题⽬链接:2208. 将数组和减半的最少操作次数
  2. 题⽬描述:
    在这里插入图片描述
  3. 解法(贪⼼):
    贪⼼策略:
    a. 每次挑选出「当前」数组中「最⼤」的数,然后「减半」
    b. 直到数组和减少到⾄少⼀半为⽌。
    为了「快速」挑选出数组中最⼤的数,我们可以利⽤「堆」这个数据结构
  4. C++代码
class Solution {double sum=0,cnt=0;priority_queue<double,vector<double>,less<double>> pq;
public:int halveArray(vector<int>& nums) {for(auto&e:nums){  sum+=e;pq.push(e);}sum/=2.0;while(sum>0){cnt++;double tmp=pq.top()/2;pq.pop();sum-=tmp;pq.push(tmp);}return cnt;}
};

1.3 最⼤数

  1. 题⽬链接:179. 最⼤数
  2. 题⽬描述
    在这里插入图片描述
  3. 解法(贪⼼):
    可以先优化:将所有的数字当成字符串处理,那么两个数字之间的拼接操作以及⽐较操作就会很⽅便。
    贪⼼策略:按照题⽬的要求,重新定义⼀个新的排序规则,然后排序即可。
    排序规则:
    a. 「A 拼接 B」 ⼤于 「B 拼接 A」,那么 A 在前,B 在后;
    b. 「A 拼接 B」 等于 「B 拼接 A」,那么 A B 的顺序⽆所谓;
    c. 「A 拼接 B」 ⼩于 「B 拼接 A」,那么 B 在前,A 在后;
  4. C++代码
class Solution {
public:string largestNumber(vector<int>& nums) {vector<string> v;for(auto&e:nums)v.push_back(to_string(e));string ret;sort(v.begin(),v.end(),[](string& s1,string& s2){return s1+s2>s2+s1;});for(int i=0;i<v.size();i++){if(i==0&&v[i]=="0")return "0";ret+=v[i];}return ret;}
};

1.4 摆动序列

  1. 题⽬链接:376. 摆动序列
  2. 题⽬描述
    在这里插入图片描述
  3. 解法(贪⼼):
    贪⼼策略:
    对于某⼀个位置来说:
    ◦ 如果接下来呈现上升趋势的话,我们让其上升到波峰的位置;
    ◦ 如果接下来呈现下降趋势的话,我们让其下降到波⾕的位置。
    因此,如果把整个数组放在「折线图」中,我们统计出所有的波峰以及波⾕的个数即可。
  4. C++代码
class Solution {
public:int wiggleMaxLength(vector<int>& nums) {int left=0,ret=0;for(int i=0;i<nums.size()-1;i++){int right=nums[i+1]-nums[i];if(right==0)continue;if(right*left<=0)ret++;left=right;}return ret+1;//加上最后一个}
};

1.5 最⻓递增⼦序列

  1. 题⽬链接:300. 最⻓递增⼦序列
  2. 题⽬描述:
    在这里插入图片描述
  3. 解法(贪⼼):
    贪⼼策略:
    我们在考虑最⻓递增⼦序列的⻓度的时候,其实并不关⼼这个序列⻓什么样⼦,我们只是关⼼最后⼀个元素是谁这样新来⼀个元素之后,我们就可以判断是否可以拼接到它的后⾯
    因此,我们可以创建⼀个数组,统计⻓度为 x 的递增⼦序列中,最后⼀个元素是谁。为了尽可能的让这个序列更⻓,我们仅需统计⻓度为 x 的所有递增序列中最后⼀个元素的「最⼩值」。
    统计的过程中发现,数组中的数呈现「递增」趋势,因此可以使⽤「⼆分」来查找插⼊位置
  4. C++代码
class Solution {int cnt=0;
public:int lengthOfLIS(vector<int>& nums) {int n=nums.size();vector<int> ret;ret.push_back(nums[0]);for(int i=1;i<nums.size();i++){if(nums[i]>ret.back())ret.push_back(nums[i]);//可以拼接到后面//如果不可以拼接到末尾则需要找到ret中出现第一次>=nums[i]的值进行替换,也就是把这个第一次大的值换成小的nums[i]else{int left=0,right=ret.size()-1;while(left<right){int mid=left+(right-left)/2;if(ret[mid]>=nums[i])right=mid;else left=mid+1;}ret[left]=nums[i];}}return ret.size();}
};

1.6 递增的三元⼦序列

  1. 题⽬链接:334. 递增的三元⼦序列
  2. 题⽬描述
    在这里插入图片描述
  3. 解法(贪⼼):
    贪⼼策略:
    最⻓递增⼦序列的简化版。
    不⽤⼀个数组存数据,仅需两个变量即可。也不⽤⼆分插⼊位置,仅需两次⽐较就可以找到插⼊位置
  4. C++代码
class Solution {
public:bool increasingTriplet(vector<int>& nums) {int n=nums.size();vector<int> ret;ret.push_back(nums[0]);for(int i=1;i<n;i++){if(nums[i]>ret.back())ret.push_back(nums[i]);else{int left=0,right=ret.size()-1;while(left<right){int mid=left+(right-left)/2;if(nums[i]>ret[mid])left=mid+1;else right=mid;}ret[left]=nums[i];}}return ret.size()>=3?true:false;}
};
----------------------------------------------------------------------------------------------
class Solution {
public:bool increasingTriplet(vector<int>& nums) {int n=nums.size();int a=nums[0],b=INT_MAX;for(int i=1;i<n;i++){if(nums[i]>b)return true;else{if(nums[i]<=a)a=nums[i];else b=nums[i];}}return false;}
};

相关文章:

【贪心算法】No.1---贪心算法(1)

文章目录 前言一、贪心算法&#xff1a;二、贪心算法示例&#xff1a;1.1 柠檬⽔找零1.2 将数组和减半的最少操作次数1.3 最⼤数1.4 摆动序列1.5 最⻓递增⼦序列1.6 递增的三元⼦序列 前言 &#x1f467;个人主页&#xff1a;小沈YO. &#x1f61a;小编介绍&#xff1a;欢迎来到…...

分布式光伏管理办法

随着分布式光伏项目的不断增加&#xff0c;传统的管理方式已经难以满足高效、精准的管理需求。光伏业务管理系统作为一种集信息化、智能化于一体的管理工具&#xff0c;正在逐步成为分布式光伏项目管理的重要支撑。 光伏业务管理系统通过数字化手段实现对光伏业务全流程的精细化…...

2024最新软件测试面试热点问题

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 大厂面试热点问题 1、测试人员需要何时参加需求分析&#xff1f; 如果条件循序 原则上来说 是越早介入需求分析越好 因为测试人员对需求理解越深刻 对测试工…...

如何利用探商宝精准营销,抓住行业机遇——以AI技术与大数据推动企业信息精准筛选

近年来&#xff0c;随着人工智能与大数据技术的迅猛发展&#xff0c;企业的营销手段和策略发生了巨大变化。尤其是在信息爆炸的数字时代&#xff0c;如何有效利用这些技术在海量数据中精准找到潜在客户&#xff0c;已成为中小企业亟待解决的核心问题。 最近&#xff0c;全球人…...

嵌入式硬件电子电路设计(三)电源电路之负电源

引言&#xff1a;在对信号线性度放大要求非常高的应用需要使用双电源运放&#xff0c;比如高精度测量仪器、仪表等;那么就需要给双电源运放提供正负电源。 目录 负电源电路原理 负电源的作用 如何产生负电源 负电源能作功吗&#xff1f; 地的理解 负电压产生电路 BUCK电…...

数据仓库还是数据集市?这俩怎么选?

数据仓库和数据集市作为支持决策分析的两种不同方式&#xff0c;根据各自的特点和优势&#xff0c;有不同的应用场景&#xff0c;今天就来探讨下数据集市和数据仓库该怎么选&#xff1f; 一、数据集市和数据仓库对比 1、数据集市与数据仓库的关系&#xff1a; 1&#xff09;数…...

计算机图形学 实验二 三维模型读取与控制

目录 一、实验内容 二、具体内容 (在实验2.3的基础上进行修改) 1、OFF格式三维模型文件的读取 2、三维模型的旋转动画 3、键盘鼠标的交互 4、模型的修改 三、代码 一、实验内容 读取实验提供的off格式三维模型&#xff0c;并对其赋色。利用鼠标和键盘的交互&#xff0…...

NAT网络工作原理和NAT类型

NAT基本工作流程 通常情况下&#xff0c;某个局域网中&#xff0c;只有路由器的ip是公网的&#xff0c;局域网中的设备都是内网ip&#xff0c;内网ip不具备直接与外部应用通信的能力。 处于内网的设备如何借助NAT来实现访问外网的应用&#xff1f; 对于开启了NAT功能的局域网…...

wget命令之Tomcat(三)

引言 Tomcat是一个开源的Java Web应用服务器&#xff0c;实现了多个关键的Java EE规范&#xff0c;包括Servlet、JSP&#xff08;JavaServer Pages&#xff09;、JavaWebSocket等。由于Tomcat技术先进、性能稳定且免费&#xff0c;它成为了许多企业和开发者的首选Web应用服务器…...

IP地址修改器 5.0 重制版

IP地址修改器是一款由 kn007 大佬编写的一个小工具&#xff0c;可以帮助小白用户方便的进行IP地址&#xff0c;网卡MAC修改等等功能&#xff0c;工具支持多网卡&#xff0c;并且支持管理导入多份配置等。 程序主要原理还是利用了WMI的Win32_NetworkAdapter、Win32_NetworkAdap…...

vscode编译s32ds工程

基本可以参考下面的文章&#xff0c;但是需要注意的是添加完环境变量后需要重启一下vscode。我现在已经能顺利编译。感谢原创 阿隆汽车 MBD_杂谈_使用VSCode编译s32k_vscode s32k-CSDN博客 https://blog.csdn.net/ALongAuto/article/details/134961294...

大数据专业为什么要学习Hadoop课程

在当今信息爆炸的时代&#xff0c;大数据成为了影响各行各业的重要因素&#xff0c;而Hadoop作为大数据处理的核心技术之一&#xff0c;自然成为大数据专业学生需要掌握的一项重要技能。本文将详细探讨大数据专业为何要学习Hadoop课程&#xff0c;帮助读者理解其必要性和实际应…...

Xilinx FPGA的Vivado开发流程

Xilinx FPGA 的 Vivado 开发流程主要包括以下步骤&#xff1a; 创建工程&#xff1a; 启动 Vivado 软件&#xff1a;双击 Vivado 图标打开软件。新建工程向导&#xff1a;在 Quick Start 中选择 Create Project&#xff0c;打开新建工程向导。设置工程信息&#xff1a; 工程名称…...

音频模型介绍

在处理音频数据方面&#xff0c;有多种模型表现出色&#xff0c;它们在不同的音频处理任务上有着各自的优势&#xff1a; 自动编码器&#xff1a;包括多通道变分自动编码器、自回归模型和生成对抗网络等&#xff0c;这些模型在音乐生成领域取得了令人印象深刻的成果。 深度生成…...

《编写沪深两市实时交易数据接收程序全攻略》

《编写沪深两市实时交易数据接收程序全攻略》 一、引言二、获取股票数据的方法&#xff08;一&#xff09;使用爬虫框架&#xff08;二&#xff09;调用股票接口&#xff08;三&#xff09;使用免费数据 API&#xff08;四&#xff09;利用 Excel 的 power query 三、数据接口及…...

一文学会easyexcel导入数据,多sheet页、字典转换【附带源码】

文章目录 前言一、业务流程二、实现1、引入easyexcel、fastjson、lombok包2、创建Json工具类3、创建自定义字典转换注解4、创建字典转换实现类5、创建数据对象类6、创建多sheet页封装对象7、创建Excel导入工具类8、创建测试类 三、接口测试1、启用项目2、使用数据导出的文件&am…...

Spring中的 InitializingBean、BeanPostProcessor、@PostConstruct 等初始化动作的执行时机分析

初始化Bean的时序图如下&#xff1a; 小结说明&#xff1a; 1、相同点&#xff1a;InitializingBean 的(afterPropertiesSet方法)、BeanPostProcessor、PostConstruct 都是在bean的属性注入完毕之后才执行&#xff0c;都可以用来进行bean的初始化动作 2、初始化执行顺序优先级…...

如何利用指纹浏览器爬虫绕过Cloudflare的防护?

网络爬虫能够系统地浏览网页并提取所需的数据&#xff0c;通常被用于市场研究、数据分析或者竞争情报。然而&#xff0c;一些反爬虫机制给网络爬虫的工作带来了不少挑战和风险。 其中&#xff0c;Cloudflare提供了多层次的防护机制&#xff0c;包括IP封锁、速率限制、CAPTCHA验…...

idea 基础简单应用(java)

Java IDE&#xff08;集成开发环境&#xff09;的使用方法因不同的IDE而异&#xff0c;但通常都包含一些基本的操作和功能。以下以IntelliJ IDEA这一流行的Java IDE为例&#xff0c;介绍Java IDE的基本使用方法与指南&#xff1a; 一、下载与安装 请点击观看 idea免费安装步…...

windows环境下vscode下载安装

vscode官网 1.vscode官网&#xff1a;Visual Studio Code - Code Editing. Redefined 进入官网&#xff0c;点击下载 右键文件&#xff0c;以管理员方式运行&#xff0c;开始安装 第一步:同意此协议 第二步&#xff1a;更改安装位置&#xff0c;可以在d盘新建一个文件夹&…...

别再乱删C盘大文件了!一文搞懂pagefile.sys和hiberfil.sys的正确处理姿势

别再乱删C盘大文件了&#xff01;一文搞懂pagefile.sys和hiberfil.sys的正确处理姿势 每次打开资源管理器看到C盘飘红&#xff0c;是不是总想找几个"大块头"开刀&#xff1f;先别急着对pagefile.sys和hiberfil.sys下手——这两个看似占空间的系统文件&#xff0c;其实…...

告别ViT的笨重:手把手教你用SegFormer在Cityscapes数据集上实现高效语义分割

告别ViT的笨重&#xff1a;手把手教你用SegFormer在Cityscapes数据集上实现高效语义分割 在自动驾驶、遥感影像分析等计算机视觉应用中&#xff0c;语义分割技术扮演着关键角色。传统基于卷积神经网络&#xff08;CNN&#xff09;的方法虽然取得了显著进展&#xff0c;但面临着…...

新手入门:用快马生成第一个交易平台风格的前端页面

今天想和大家分享一个特别适合前端新手的练手项目——用InsCode(快马)平台快速搭建一个简易的交易平台前端页面。作为一个刚接触金融科技开发的小白&#xff0c;我发现这种模拟真实业务场景的项目特别能激发学习兴趣。 项目目标拆解 这个模拟交易账户页面需要实现几个核心功能模…...

告别996!我用Qoder AI编程平台,一天搞定全栈电商项目(附保姆级实战流程)

从零到上线&#xff1a;Qoder AI全栈电商项目实战手记 凌晨三点的显示器蓝光里&#xff0c;我第17次调试购物车接口时&#xff0c;咖啡杯底黏着的便签写着"再熬三天就能交付"。这个典型的程序员996场景&#xff0c;在上个月使用Qoder开发新电商平台时被彻底颠覆——从…...

保姆级教程:在Android项目中集成微信Matrix性能监控框架(含避坑指南)

Android性能监控实战&#xff1a;微信Matrix框架深度集成指南 在移动应用开发领域&#xff0c;性能优化始终是开发者面临的核心挑战之一。微信开源的Matrix框架作为一套全平台性能监控工具链&#xff0c;为Android开发者提供了从方法耗时、ANR检测到内存泄漏分析等全方位的监控…...

256K上下文颠覆智能编程:Qwen3-Coder重构全栈开发效率范式

256K上下文颠覆智能编程&#xff1a;Qwen3-Coder重构全栈开发效率范式 【免费下载链接】Qwen3-Coder-30B-A3B-Instruct 项目地址: https://ai.gitcode.com/hf_mirrors/unsloth/Qwen3-Coder-30B-A3B-Instruct 问题发现&#xff1a;传统AI编程助手的三大痛点 2025年Stac…...

Lingyuxiu MXJ LoRA开源镜像指南:从下载到生成的完整开箱即用流程

Lingyuxiu MXJ LoRA开源镜像指南&#xff1a;从下载到生成的完整开箱即用流程 1. 项目简介 Lingyuxiu MXJ LoRA 是一款专门为生成唯美真人风格人像而设计的轻量级AI图像生成系统。这个项目最大的特点就是针对人像摄影进行了深度优化&#xff0c;能够生成五官精致、光影柔和、…...

TheAmazingAudioEngine实战案例:构建完整的音乐制作应用

TheAmazingAudioEngine实战案例&#xff1a;构建完整的音乐制作应用 【免费下载链接】TheAmazingAudioEngine 项目地址: https://gitcode.com/gh_mirrors/th/TheAmazingAudioEngine TheAmazingAudioEngine是一款功能强大的音频处理框架&#xff0c;专为移动应用开发打造…...

终极指南:Google Maps Python客户端错误处理与异常类型完全解析

终极指南&#xff1a;Google Maps Python客户端错误处理与异常类型完全解析 【免费下载链接】google-maps-services-python Python client library for Google Maps API Web Services 项目地址: https://gitcode.com/gh_mirrors/go/google-maps-services-python 在Pytho…...

500+精选RSS源如何解决信息获取难题:Awesome RSS Feeds全解析

500精选RSS源如何解决信息获取难题&#xff1a;Awesome RSS Feeds全解析 【免费下载链接】awesome-rss-feeds Awesome RSS feeds - A curated list of RSS feeds (and OPML files) used in Recommended Feeds and local news sections of Plenary - an RSS reader, article dow…...