贪心算法总结(1)

news2024/12/24 20:39:10

一、贪心算法简介

常用方法:交换论证法、数学归纳法、反证法、分类讨论 

 二、柠檬水找零(交换论证法)

. - 力扣(LeetCode)

class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
         int five=0,ten=0;
         for(auto&e:bills)
            if(e==5) ++five;
            else if(e==10)
            {
                if(five==0) return false;
                --five,++ten;
            }
            else //贪心策略
            {
                if(five&&ten) --five,--ten;
                else if(five>=3) five-=3;
                else return false;
            }
         return true;
    }
    //交换论证法、数学归纳法和反证法常用的策略
};

三、将数组减半的最小操作次数(交换论证法)

. - 力扣(LeetCode)

class Solution {
public:
    int halveArray(vector<int>& nums) {
        priority_queue<double> q(nums.begin(),nums.end());
        double sum=accumulate(nums.begin(),nums.end(),0.0);
        int ret=0;
        sum/=2.0;
        while(sum>0)
        {
            double t=q.top()/2.0;
            q.pop();
            sum-=t;
            q.push(t);
            ++ret;
        }
        return ret;
    }
};

四、最大数(排序规则理解+全序性证明)

. - 力扣(LeetCode)

class Solution {
public:
    string largestNumber(vector<int>& nums) {
       //贪心策略 先转化成字符串 然后利用字典序排序
       vector<string> strs;
       strs.reserve(nums.size());//提前扩容 小优化
       for(auto&e:nums) strs.emplace_back(to_string(e));
       sort(strs.begin(),strs.end(),[](const string&s1,const string&s2)
       {
               return s1+s2>s2+s1;//大的在前面
       });
       //按顺序加入到ret中返回 
       string ret;
       for(auto&s:strs) ret+=s;
       //细节处理:前导0 除非都是0才会出现前导0  所以我们只需要当出现前导0的时候,返回"0"即可
       if(ret[0]=='0') return "0";
       return ret;
    }
    //全序关系  一个集合中任意选出两个元素 如果在你定义的比较规则下能够满足全序关系
                //我们就说这个集合是可以排序的
        //1、完全性 可以推测出他的大小关系(a>=b a<=b)
        //2、反对称性 a>=b&&b>=a  ——>a==b   a前和b前无所谓(唯一性)
        //3、传递性 a>=b  b>=c a>=c
};

五、摆动序列(反证法)

. - 力扣(LeetCode)

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) 
    {
        int n=nums.size();
        if(n<2) return n;
      //总是选择当前的最优策略
       int left=0,ret=0; //left表示左边的状态
       for(int i=0;i<n-1;++i)
       {
        int right=nums[i+1]-nums[i];
        if(right==0) continue;//跳过相等的情况
        if(right*left<=0) ++ret;
        left=right;
       }
      return ret+1; //算上最后一个
    }
};

 六、最长递增子序列(交换论证)

. - 力扣(LeetCode)

贪心+二分

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) 
    {
       //贪心+二分
       int n=nums.size();
       vector<int> ret;
       ret.emplace_back(nums[0]);
       for(int i=1;i<n;++i)
         //如果比最后一个数大 就直接尾插即可
         if(nums[i]>ret.back()) ret.emplace_back(nums[i]);
         //否则就用二分
         else 
         {
            int left=0,right=ret.size()-1;
            while(left<right)
            {
                int mid=(left+right)>>1;
                if(ret[mid]<nums[i]) left=mid+1;
                else right=mid;
            }
            ret[left]=nums[i];
         }
        return ret.size();
    }
};

 七、递增的三元子序列

. - 力扣(LeetCode)

贪心: 

class Solution {
public:
    bool increasingTriplet(vector<int>& nums) {
     //贪心策略
     int n=nums.size();
     if(n<3) return false;
     int first=nums[0];
     int second=INT_MAX;
     for(int i=1;i<n;++i)
        if(nums[i]>second) return true;
        else if(nums[i]>first) second=nums[i];
        else first=nums[i];//否则我肯定比较小 就得更新first
     return false;
    }
};

八、最长连续递增子序列

. - 力扣(LeetCode)

贪心+滑动窗口: 

class Solution {
public:
    int findLengthOfLCIS(vector<int>& nums) {
     //贪心+双指针
     int ret=0;
     int n=nums.size();
     for(int i=0;i<n;)
     {
       int j=i+1;
       while(j<n&&nums[j]>nums[j-1]) ++j;
       ret=max(j-i,ret);
       i=j;
     }
     return ret;
    }
};

 

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

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

相关文章

蜂窝物联云平台:一站式服务,智能生活从此开始!

蜂窝云平台 一、PC端展示与管理 GIS地图整合 在GIS地图上精确展示地块&#xff0c;轻松点选查看详细设备信息、实时监控和控制功能&#xff0c;以及基地的全方位介绍。 个性化定制界面 界面布局与功能展示均可按需求定制&#xff0c;打造独一无二的用户体验。 数据集中看板 将…

html网页使用tesseract实现OCR文字识别

即在前端实现OCR文字识别 1.前端代码 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>OCR文字识别…

C/C++ json库

文章目录 一、介绍1.1 json 介绍 二、C/C json 库选型2.1 选型范围2.2 jsoncpp2.2.2 jsoncpp 编译和交叉编译 2.3 rapidjson2.4 nlohmann/json2.5 sonic-cpp 五、常见问题5.1 jsoncpp 中关于浮点数的控制和中文显示问题5.2 jsoncpp序列化double类型时精度损失问题的解决办法 一…

JavaWeb JavaScript ① JS简介

目录 一、HTML&CSS&JavaScript的作用 二、前后端关联标签——表单标签 1.form标签 2.input标签 3.get/post提交的差异 4.表单项标签 5.布局相关标签 块元素——div 行内元素——span 三、CSS 1.CSS引入方式 方式1 行内式 方式2 内嵌式 方式3 外部样式表 2.CSS选择器 元…

AWS Certified Developer Associate备考笔记

AWS Certified Developer Associate备考笔记 缓慢更新中&#xff0c;如果你也正在关注该考试&#xff0c;请点赞后评论感兴趣的章节&#xff0c;可加快我的更新速度 &#x1f603; 文章目录 AWS Certified Developer Associate备考笔记一、IAM二、EC2三、EC2 Instance Storage…

Spring Boot项目中使用MyBatis Generator (MBG) 自动生成Mapper文件

Spring Boot项目中使用MyBatis Generator (MBG) 自动生成Mapper文件可以很大程度上减少编码。本文着重介绍如何在实战中使用MGB自动生成Mapper文件 1. 添加MyBatis Generator依赖 在pom.xml中添加必要的依赖 <dependency><groupId>org.mybatis.spring.boot</…

【Python系列】Python 中的文件读取

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

秒懂设计模式--学习笔记(11)【结构型-享元模式】

目录 10、享元模式10.1 享元模式10.2 举例10.2.1 马赛克10.2.2 游戏地图&#xff08;以草原地图作为范例&#xff09; 10.3 总结 10、享元模式 10.1 享元模式 “享元”则是共享元件的意思享元模式的英文flyweight是轻量级的意思&#xff0c;这就意味着享元模式能使程序变得更…

Training for Stable Diffusion

Training for Stable Diffusion 笔记来源&#xff1a; 1.Denoising Diffusion Probabilistic Models 2.最大似然估计(Maximum likelihood estimation) 3.Understanding Maximum Likelihood Estimation 4.How to Solve ‘CUDA out of memory’ in PyTorch 1.1 Introduction 训…

FastBee物联网开源项目本地启动调试

一、本地环境准备 &#xff08;1&#xff09;Visual Studio Code&#xff08;启动前端项目&#xff09; &#xff08;2&#xff09;IntelliJ IDEA Community Edition &#xff08;启动后端项目&#xff09; &#xff08;3&#xff09;Navicat或者DBeaver&#xff08;用来操…

Godot学习笔记2——GDScript变量与函数

目录 一、代码编写界面 二、变量 三、函数 四、变量的类型 Godot使用的编程语言是GDS&#xff0c;语法上与python有些类似。 一、代码编写界面 在新建的Godot项目中&#xff0c;点击“创建根节点”中的“其他节点”&#xff0c;选择“Node”。 点击场景界面右上角的绿色…

【STM32】按键控制LED光敏传感器控制蜂鸣器(江科大)

一、按键控制LED LED.c #include "stm32f10x.h" // Device header/*** 函 数&#xff1a;LED初始化* 参 数&#xff1a;无* 返 回 值&#xff1a;无*/ void LED_Init(void) {/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENAB…

此扩展在此工作区中被禁用,因为其被定义为在远程扩展主机中运行。

使用VScode打开代码时&#xff0c;无法跳转函数&#xff0c;不提示报错。 安装python时显示&#xff0c; 此扩展在此工作区中被禁用&#xff0c;因为其被定义为在远程扩展主机中运行。 解决方法&#xff1a; CtrlShiftP &#xff1a;键入trust &#xff0c;工作区&#xff…

空间计算新时代:Vision Pro引领AR/VR/MR市场变革

随着2024年第二季度的结束&#xff0c;空间计算领域的市场动态愈发引人关注。根据国际数据公司&#xff08;IDC&#xff09;的最新报告&#xff0c;我们见证了行业格局的重大变化&#xff0c;尤其是苹果Vision Pro的突出表现&#xff0c;以及AR/VR/MR设备市场的整体趋势。以下是…

LabVIEW软件开发的雷区在哪里?

在LabVIEW软件开发中&#xff0c;有几个需要注意的雷区&#xff0c;以避免常见的错误和提高开发效率&#xff1a; 1. 不良的代码结构 雷区&#xff1a;混乱的代码结构和不清晰的程序逻辑。 后果&#xff1a;导致难以维护和调试的代码&#xff0c;增加了错误和故障的风险。 …

无人机侦察:二维机扫雷达探测设备技术详解

二维机扫雷达探测设备采用机械扫描方式&#xff0c;通过天线在水平方向和垂直方向上的转动&#xff0c;实现对目标空域的全方位扫描。雷达发射机发射电磁波信号&#xff0c;遇到目标后产生反射&#xff0c;反射信号被雷达接收机接收并处理&#xff0c;进而得到目标的位置、速度…

搜维尔科技:【研究】动作捕捉加速游戏开发行业的发展

动作捕捉加速游戏开发行业的发展 Sunjata 的故事始于 2004 年&#xff0c;它将席卷乌干达视频游戏行业&#xff0c;然后席卷全世界。但首先&#xff0c;Klan Of The Kings 的小团队需要工具来实现他们的愿景。 漫画家兼非洲民间传说爱好者罗纳德卡伊马 (Ronald Kayima) 在将…

怎样在 PostgreSQL 中进行用户权限的精细管理?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 怎样在 PostgreSQL 中进行用户权限的精细管理&#xff1f;一、权限管理的重要性二、PostgreSQL 中的权…

[解决方法]Request failed with status code 500错误之一

在写项目时访问后端api时我的axios拦截器进入了错误 然后去浏览器搜索&#xff0c;但是大部分都是因为axios参数或参数格式问题导致的&#xff0c;然而在访问api的编写没有任何问题&#xff0c;后来我反复检查&#xff0c;发现是我写前后端写混了&#xff0c;我把express的 Co…

学习大数据DAY20 Linux环境配置与Linux基本指令

目录 Linux 介绍 Linux 发行版 Linux 和 Windows 比较 Linux 就业方向&#xff1a; 下载 CentOS Linux 目录树 Linux 目录结构 作业 1 常用命令分类 文件目录类 作业 2 vim 编辑文件 作业 3 你问我第 19 天去哪了&#xff1f;第 19 天在汇报第一阶段的知识总结&#xff0c;没什…