贪心算法总结(4)

news2024/12/23 12:28:37

一、跳跃游戏I

55. 跳跃游戏 - 力扣(LeetCode)

class Solution {
public:
    bool canJump(vector<int>& nums) {
          //贪心+双指针   用left和right指向两个区间 然后maxpos表示下一层的最右端点
        int left=0,right=0,maxpos=0,n=nums.size();
        while(left<=right) //有可能会跳不到n-1的位置 比如说出现了很多个0
        {
            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;
    }
};

二、跳跃游戏II

45. 跳跃游戏 II - 力扣(LeetCode)

 解法1 :动态规划

class Solution {
public:
    int jump(vector<int>& nums) {
   //动态规划的思想 dp[i]表示以i位置为结尾时的最小步数
       int n=nums.size();
       vector<int> dp(n,INT_MAX);
       dp[0]=0;
       for(int i=1;i<n;++i)
         for(int j=0;j<i;++j)
          if(nums[j]+j>=i) dp[i]=min(dp[i],dp[j]+1);
        return dp[n-1];
    }
};

解法2:贪心 +双指针

class Solution {
public:
    int jump(vector<int>& nums) {
        //贪心+双指针   用left和right指向两个区间 然后maxpos表示下一层的最右端点
        int left=0,right=0,maxpos=0,ret=0,n=nums.size();
        while(left<=right) //有可能会跳不到n-1的位置 比如说出现了很多个0
        {
            if(maxpos>=n-1) return ret;
            for(int i=left;i<=right;++i) maxpos=max(maxpos,nums[i]+i);
            //找到之后更新区间
            left=right+1;
            right=maxpos;
            ++ret;
        }
        return -1;
    }
};

三、加油站

134. 加油站 - 力扣(LeetCode)

四、距离相等的条形码

1054. 距离相等的条形码 - 力扣(LeetCode)

class Solution {
public:
    vector<int> rearrangeBarcodes(vector<int>& nums) {
      //贪心  隔一个放一个 要顺便统计最多的那个
      int n=nums.size();
      unordered_map<int,int> hash;
      int maxval=0,maxcount=0;
      for(auto&e:nums)
        if(maxcount<++hash[e])
        {
            maxcount=hash[e];
            maxval=e;
        }
      //开始先放最大的数
      vector<int> ret(n);
      int index=0;
      for(int i=0;i<maxcount;++i)
      {
         ret[index]=maxval;
         index+=2;
      }
      hash.erase(maxval);
      //开始放后面的数字
      for(auto&[x,y]:hash)
         for(int i=0;i<y;++i)
         {
            if(index>=n) index=1;
            ret[index]=x;
            index+=2;
         }
      return ret;
    }
};

五、合并区间

56. 合并区间 - 力扣(LeetCode)

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& nums) {
       //区间问题  按照左端点排序
       sort(nums.begin(),nums.end());
       int n=nums.size();
       //合并区间
       //用left和right来标记两个区间
       //如果left right     a   b   如果重叠了a<=right right=max(right,b)
                                    //如果没有重叠 将left和right丢到ret中  然后更新
        int left=nums[0][0],right=nums[0][1];
        vector<vector<int>> ret;
        for(int i=1;i<n;++i)
        {
            int a=nums[i][0],b=nums[i][1];
            if(a<=right) right=max(right,b);
            else 
            {
              ret.push_back({left,right});
              left=a,right=b;
            }
        }
        ret.push_back({left,right});
        return ret;
    }
};

六、无重叠区间

435. 无重叠区间 - 力扣(LeetCode)

class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& nums) {
        sort(nums.begin(),nums.end());
        int n=nums.size();
        int ret=0;
        int left=nums[0][0],right=nums[0][1];
        for(int i=1;i<n;++i)
        {
            int a=nums[i][0],b=nums[i][1];
            if(a<right) 
            {
                right=min(right,b);
                ++ret;
            } //移除右端点较大的区间  更新右区间
            else right=b;
        }
        return ret;
    }
};

七、用最少数量的箭引爆气球

452. 用最少数量的箭引爆气球 - 力扣(LeetCode)

class Solution {
public:
    int findMinArrowShots(vector<vector<int>>& nums) {
      //只要出现重叠区间,就可以用一只箭射穿
      sort(nums.begin(),nums.end());
      int n =nums.size();
      int left=nums[0][0],right=nums[0][1]; //保留的是交集
      int ret=1;
      for(int i=1;i<n;++i)
      {
        int a=nums[i][0],b=nums[i][1];
        if(a<=right)//如果有交集 
        {
          right=min(right,b);
        }
        else //说明没有交集
        {
            right=b;
            ++ret;
        }
      }
      return ret;
    }
};

八、俄罗斯套娃信封问题

354. 俄罗斯套娃信封问题 - 力扣(LeetCode)

class Solution {
public:
    int maxEnvelopes(vector<vector<int>>& e) {
       //重写排序+贪心+二分
       int n=e.size();
       sort(e.begin(),e.end(),[&e](const vector<int>&v1, const vector<int>&v2){
             return v1[0]!=v2[0]?v1[0]<v2[0]:v1[1]>v2[1];
       });
       vector<int> ret;
       ret.emplace_back(e[0][1]);
       for(int i=1;i<n;++i)
       {
          int b=e[i][1];
         //如果我比最后一个都大 我直接尾插
         if(b>ret.back()) ret.emplace_back(b);
         else //否则就二分
         {
             int left=0,right=ret.size()-1;
             while(left<right)
             {
               int mid=(left+right)>>1;
               if(ret[mid]<b) left=mid+1;
               else right=mid;
             }
             ret[left]=b;
         }
       }
       return ret.size();
    }
};

九、堆箱子

面试题 08.13. 堆箱子 - 力扣(LeetCode)

class Solution {
public:
    int pileBox(vector<vector<int>>& nums) {
       sort(nums.begin(),nums.end());
       int n=nums.size();
       //23 54 64 67
       //dp[i]表示以i位置为结尾的最长递增子序列的长度
       vector<int> dp(n);
       for(int i=0;i<n;++i) dp[i]=nums[i][2];
       for(int i=1;i<n;++i)
          //开始往前找
          for(int j=0;j<i;++j) 
          if(nums[i][0]>nums[j][0]&&nums[i][1]>nums[j][1]&&nums[i][2]>nums[j][2])
           dp[i]=max(dp[i],dp[j]+nums[i][2]);
        return *max_element(dp.begin(),dp.end()); 
    }
};

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

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

相关文章

《乳腺密度高的女性中,使用AI辅助的乳腺X线筛查与补充筛查超声的比较研究》| 文献速递-基于深度学习的乳房、前列腺疾病诊断系统

Title 题目 Screening Outcomes of Mammography with AI in Dense Breasts: A Comparative Study with Supplemental Screening US 《乳腺密度高的女性中&#xff0c;使用AI辅助的乳腺X线筛查与补充筛查超声的比较研究》 Background 背景 Comparative performance between…

html+css 实现hover 故障效果按钮

前言:哈喽,大家好,今天给大家分享html+css 实现hover 故障效果按钮!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 📚一、效果📚二、原理解析💡1.这是一个,鼠标hover时,显示故障的效…

WechatBotCMD:通过命令行接口实现微信机器人自动化

WechatBotCMD&#x1f916;&#xff1a;通过命令行接口实现微信机器人自动化 WechatBotCMD简介WechatBotCMD的核心功能1. **命令行界面 (CLI)**2. **消息处理与自动回复**3. **定时任务**4. **群聊管理**5. **配置管理** 如何安装或引入 WechatBotCMDWechatBotCMD使用示例启动和…

Leetcode JAVA刷刷站(33)搜索旋转排序数组

一、题目概述 二、思路方向 要设计一个时间复杂度为 O(log n) 的算法来找到旋转排序数组中的目标值&#xff0c;我们可以利用二分查找的变种方法。关键在于&#xff0c;虽然数组被旋转了&#xff0c;但数组被分为两部分后&#xff0c;每部分仍然是升序的。我们可以利用这个性质…

后端Web核心之请求响应

目录 1.概述 2.接收请求 简单参数和实体参数 数组集合参数 日期参数和JSON参数 路径参数 总结 3.返回响应 1.概述 Web请求和响应是HTTP协议中的核心概念&#xff0c;它们是客户端&#xff08;通常是浏览器&#xff09;与服务器之间通信的基础。 浏览器发起请求后&…

大数据-85 Spark 集群 RDD创建 RDD-Action Key-Value RDD详解 RDD的文件输入输出

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09; HDFS&#xff08;已更完&#xff09; MapReduce&#xff08;已更完&…

机器学习:knn算法

1、概述 全称是k-nearest neighbors&#xff0c;通过寻找k个距离最近的数据&#xff0c;来确定当前数据值的大小或类别。K-近邻算法是一种基本而又有效的机器学习算法&#xff0c;用于分类和回归任务。它属于实例学习方法&#xff0c;或者说是一种基于规则的记忆方法。 2、基本…

STM32外设篇:MPU6050

MPU6050简介 MPU6050是一个6轴姿态传感器&#xff0c;可以测量芯片自身X、Y、Z轴的加速度、角速度参数&#xff0c;通过数据融合可进一步得到姿态角&#xff08;欧拉角&#xff09;&#xff0c;常应用于平衡小车、飞行器等需要检测自身姿态的场景。 3轴加速度计3轴陀螺仪传感…

各种国产操作系统,一个 U 盘搞定

熟悉 Windows 装机的朋友对老毛桃和大白菜这类装机工具应该不陌生。这两款流行的工具可以用来制作启动盘&#xff0c;方便进行系统安装、备份和还原等操作。它们集成了多种磁盘工具&#xff0c;并支持一个启动 U 盘安装多个版本的 Windows 系统&#xff0c;如 Windows 7、Windo…

css中的高度塌陷

CSS高度塌陷&#xff08;或称为高度坍塌&#xff09;是指在某些特定情况下&#xff0c;元素的高度无法被正确计算或显示的现象。这通常发生在具有浮动属性的元素或使用绝对定位的元素周围。 原因 高度塌陷通常发生在父元素包含着一个或多个浮动元素时。由于浮动元素被移出了正…

ChatTTS部署

1、创建conda环境 conda create -n TTS python3.10 conda activate TTS2、拉取源代码 # 从 GitHub 下载代码 git clone https://github.com/2noise/ChatTTS cd ChatTTS拉取模型文件 git clone https://www.modelscope.cn/pzc163/chatTTS.git ChatTTS-Model3、安装环境依赖 …

UDP详解/消息边界

本文旨在解释了为什么说UDP是不可靠,到底什么是UDP的消息边界,以及UDP是否会出现粘包和半包的问题 概念 UDP协议是一种面向非连接的协议,面向非连接指的是在正式通信前不必与对方先建立连接,不管对方状态就直接发送,至于对方是否可以接收到这些数据内容,UDP协议无法控制…

HTML+CSS进阶用法 (下)——移动端适配、媒体查询和响应式布局

欢迎来到移动端适配方案的介绍&#xff01;随着移动互联网的快速发展&#xff0c;越来越多的用户通过手机和平板电脑访问网站。为了确保网站能够在各种设备上呈现出最佳的视觉效果和用户体验&#xff0c;我们需要采取有效的适配策略。本篇文章将带你了解几种常用的适配方法&…

记事本打不开(保姆级教程)

问题可能是这样的&#xff1a; 1. 应用程序故障&#xff1a;记事本程序可能遇到了临时的应用程序故障或错误。 2. 系统文件损坏&#xff1a;系统文件损坏或丢失可能导致记事本无法正常启动。 3. 注册表问题&#xff1a;注册表中的条目错误或缺失可能影响记事本的加载。 4. 输入…

Blender的Python编程介绍

在Blender这个免费的开源3D设计软件中&#xff0c;最值得称道的一点是可以用Python程序来辅助进行3D设计&#xff0c;我们可以通过Python来调整物体的属性&#xff0c;生成新的物体&#xff0c;甚至生成新的动画等等。 在最近的一个项目中&#xff0c;我用Blender制作了一个动…

PVE 系统下虚拟机数据盘从IDE转换为VIRIO

一、卸载已经挂载的 IDE 数据盘 [rootlocalhost ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root 29G 897M 29G 4% / devtmpfs 909M 0 909M 0% /dev tmpfs 920M 0 920M 0% /dev/shm tmpfs 920M 8.5M 912M 1% /run tmpfs 920M 0 920M 0% /sys/fs/cgro…

nginx的平滑升级及版本回滚

官方源码包下载地址&#xff1a;nginx: download 一、编译安装Nginx-1.24.0 [rootNginx ~]# dnf install gcc pcre-devel zlib-devel openssl-devel -y [rootNginx ~]# mkdir /nginx #创建目录&#xff0c;将nginx-1.24.0.tar.gz放在这个目录里 [rootNginx nginx]# tar…

C++的动态数组以及std:vector的优化

文章目录 静态数组动态数组代码背景第一种打印方式&#xff1a;使用 for 循环和索引解释 第二种打印方式&#xff1a;使用基于范围的 for 循环解释改进方式&#xff1a;避免拷贝 总结清理数组 代码示例代码分析输出结果总结 代码示例代码详解总结使用 reserve 的优点:使用 empl…

【考研数学】定积分应用——旋转体体积的计算(一文以蔽之)

目录 一、如何计算旋转体体积&#xff1f;思考一个小例子 二、旋转体体积的二重积分表达式 三、用真题&#xff0c;小试牛刀 定积分的应用中&#xff0c;有一类题是求解旋转体的体积问题。 相较于记忆体积计算公式&#xff0c;有一种通法求解体积更不容易出错&#xff1a;二重…

系统数据库介绍及实践

目录 案例 【题目】 【问题 1】(8 分) 【问题 2】(13 分) 【问题 3】(4 分) 【答案】 【问题 1】解析 【问题 2】解析 【问题 3】解析 相关推荐 案例 阅读以下关于应用系统数据架构的说明&#xff0c;在答题纸上回答问题 1 至问题 3。 【题目】 某软件公司拟开发一套…