leetcode贪心算法题总结(三)

本章目录

  • 1.合并区间
  • 2.无重叠区间
  • 3.用最少数量的箭引爆气球
  • 4.整数替换
  • 5.俄罗斯套娃信封问题
  • 6.可被三整除的最大和
  • 7.距离相等的条形码
  • 8.重构字符串

1.合并区间

合并区间
在这里插入图片描述

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        int n = intervals.size();
        //先按左端点进行排序
        sort(intervals.begin(),intervals.end());
        int left = intervals[0][0],right = intervals[0][1];
        vector<vector<int>> ret;
        //进行区间合并
        for(int i=1;i<n;i++)
        {
            int a = intervals[i][0],b = intervals[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;
    }
};

2.无重叠区间

无重叠区间
在这里插入图片描述

class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        int n = intervals.size();
        //按照左端点进行排序
        sort(intervals.begin(),intervals.end());
        int ret = 0;
        //移除区间
        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(a<right)
            {
                ret++;
                right = min(right,b);
            }
            else
            {
                right = b;
            }
        }
        return ret;
    }
};

3.用最少数量的箭引爆气球

用最少数量的箭引爆气球
在这里插入图片描述

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
            {
                ret++;
                right = b;
            }
        }
        return ret+1;//最后一个也需要一支箭
    }
};

4.整数替换

整数替换
在这里插入图片描述

class Solution {
    unordered_map<long long,long long> hash;//存储某一个数到1的最小步数
public:
    int integerReplacement(int n) {
        //法一:递归+记忆化搜索
        return dfs(n);
    }

    long long dfs(long long n)
    {
        if(hash.count(n)) return hash[n];
        if(n == 1)
        {
            hash[1] = 0;
            return hash[1];
        }
        if(n%2==0)
        {
            hash[n] = 1+dfs(n/2);
            return hash[n];
        }
        else
        {
            hash[n] = 1+min(dfs(n+1),dfs(n-1));
            return hash[n];
        }
    }
};
class Solution {
public:
    int integerReplacement(int n) {
        //法二:贪心+找规律
        int ret = 0;
        while(n>1)
        {
            if(n%2 == 0)
            {
                n /= 2;
                ret++;
            }
            else
            {
                if(n == 3) 
                {
                    ret += 2;
                    n =1;
                }
                else if(n%4 ==1)
                {
                    ret +=2;
                    n /=2;
                }
                else
                {
                    ret += 2;
                    n = n/2 +1;
                }
            }
        }
        return ret;
    }
};

5.俄罗斯套娃信封问题

俄罗斯套娃信封问题
在这里插入图片描述

class Solution {
public:
    int maxEnvelopes(vector<vector<int>>& e) {
        //法一:动态规划 O(n^2) 超时
        //状态表示:dp[i]表示:以i位置的信封为结尾的所有套娃序列中,最长的套娃序列的长度
        int n = e.size();
        vector<int> dp(n,1);
        sort(e.begin(),e.end());
        int ret = 1;
        for(int i=1;i<n;i++)
        {
            for(int j=0;j<i;j++)
            {
                if(e[i][0]>e[j][0]&&e[i][1]>e[j][1])
                {
                    dp[i] = max(dp[i],dp[j]+1);
                }
            }
            ret = max(ret,dp[i]);
        }
        return ret;
    }
};

在这里插入图片描述

class Solution {
public:
    int maxEnvelopes(vector<vector<int>>& e) {
        //法二:重写排序+贪心+二分
        int n = e.size();
        sort(e.begin(),e.end(),[&](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.push_back(e[0][1]);
        for(int i=1;i<n;i++)
        {
            int a = e[i][1];
            if(a>ret.back())
            {
                ret.push_back(a);
            }
            else
            {
                int left = 0,right = ret.size()-1;
                while(left<right)
                {
                    int mid = (left+right)>>1;
                    if(ret[mid]>=a) right = mid;
                    else left = mid+1;
                }
                ret[left] = a;
            }
        }
        return ret.size();
    }
};

6.可被三整除的最大和

可被三整除的最大和
在这里插入图片描述

class Solution {
public:
    int maxSumDivThree(vector<int>& nums) {
        //正难则反 
        //把所有的数都累加起来,根据累加和进行删除
        const int INF = 0x3f3f3f3f;
        int x1 = INF,x2 = INF,y1 = INF,y2 = INF,sum = 0;
        for(auto x:nums)
        {
            sum+=x;
            if(x%3 ==1)
            {
                if(x<x1)
                {
                    x2 = x1;
                    x1 = x;
                }
                else if(x<=x2)
                {
                    x2 = x;
                }
            }
            else if(x%3 ==2)
            {
                if(x<y1)
                {
                    y2 = y1;
                    y1 = x;
                }
                else if(x<=y2)
                {
                    y2 = x;
                }
            }
        }
        //分类讨论
        if(sum%3==0) return sum;
        else if(sum%3 ==1) return max(sum-x1,sum-y1-y2);
        else return max(sum-y1,sum-x1-x2);
    }
};

7.距离相等的条形码

距离相等的条形码
在这里插入图片描述

class Solution {
public:
    vector<int> rearrangeBarcodes(vector<int>& barcodes) {
        unordered_map<int,int> hash;//统计每个数字出现的次数
        int maxVal = 0,maxCount = 0;
        for(auto x:barcodes)
        {
            if(maxCount<++hash[x])
            {
                maxCount = hash[x];
                maxVal = x;
            }
        }
        //先处理出现次数最多的哪个数
        int n = barcodes.size();
        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-1) index = 1;
                ret[index] = x;
                index += 2;
            }
        }
        return ret;
    }
};

8.重构字符串

重构字符串
在这里插入图片描述

class Solution {
public:
    string reorganizeString(string s) {
        //模拟+贪心
        int hash[26] = {0};
        char maxChar = ' ';
        int maxCount = 0;
        for(auto x:s)
        {
            if(maxCount<++hash[x-'a'])
            {
                maxCount = hash[x-'a'];
                maxChar = x;
            }
        }
        //先判断
        int n = s.size();
        if(maxCount>(n+1)/2) return "";
        string ret(n,' ');
        int index = 0;
        //先处理出现次数最多的那个字符
        for(int i=0;i<maxCount;i++)
        {
            ret[index] = maxChar;
            index += 2;
        }
        //再处理其他字符
        hash[maxChar-'a'] = 0;
        for(int i=0;i<26;i++)
        {
            for(int j=0;j<hash[i];j++)
            {
                if(index>n-1) index = 1;
                ret[index] = 'a'+i;
                index += 2;
            }
        }
        return ret;
    }
};

这个系列到此就全部完啦,希望对您有所帮助,有什么不懂的可以直接私信我,我会为大家进行依次解答呀!

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

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

相关文章

ZigBee案例笔记 - 无线点灯

文章目录 无线点灯实验概述工程关键字工程文件夹介绍Basic RF软件设计框图简单说明工程操作Basic RF启动流程Basic RF发送流程Basic RF接收流程 无线点灯案例无线点灯现象 无线点灯实验概述 ZigBee无线点灯实验&#xff08;即Basic RF工程&#xff09;&#xff0c;由TI公司提供…

第一讲:BeanFactory和ApplicationContext

BeanFactory和ApplicationContext 什么是BeanFactory 它是ApplicationContext的父接口它才是Spring的核心容器&#xff0c;主要的ApplicationContext实现都组合了它的功能 BeanFactory能做什么? 表面上看BeanFactory的主要方法只有getBean()&#xff0c;实际上控制反转、基…

Spring-5-切入点的高级使用

Spring提供了两个额外的Pointcut实现&#xff0c;分别是ComposablePointcut和ControlFlowPointcut,它们提供了所需的灵活性。 使用控制流切入点 由ControlFlowPointcut类实现的Spring控制流切入点类似于许多其他AOP实现中可用的cflow构造&#xff0c;尽管功能上没有那么强大。…

(self-supervised learning)Event Camera Data Pre-training

Publisher: ICCV 2023 MOTIVATION OF READING: 自监督学习、稀疏事件 NILM link: https://arxiv.org/pdf/2301.01928.pdf Code: GitHub - Yan98/Event-Camera-Data-Pre-training 1. Overview Contributions are summarized as follows: 1. A self-supervised framework f…

“产品经理必懂的关键术语“

产品经理是现代企业中非常重要的一个角色&#xff0c;他们负责制定产品策略、规划产品开发流程、管理产品质量和用户反馈等等。然而&#xff0c;对于产品经理来说&#xff0c;了解并掌握相关的专业术语是非常重要的。本篇文章会介绍一些产品经理需要掌握的专业术语&#xff0c;…

一篇文章掌握系统架构的演变和常见微服务框架

目录 前言 一、系统架构的演变 1、单体应用架构 优点&#xff1a; 缺点&#xff1a; 2、垂直应用架构 优点&#xff1a; 缺点&#xff1a; 3、分布式SOA架构 3.1 什么是SOA 3.2 SOA架构 优点&#xff1a; 缺点&#xff1a; 4、微服务架构 优点&#xff1a; 缺点…

eve环境虚拟机和电脑如何传送文件

一.桥接 &#xff08;实现电脑和虚拟机在同一网段&#xff09; 虚拟机上网盘设置 二.属性---文件共享设置 1打开属性&#xff0c;点击共享 2.添加共享人为全部人&#xff0c;并修改权限为读写模式 3.点击高级共享&#xff0c;选定此文件夹 4.点击网络和共享中心&#xff0c;划…

C++——智能指针和RAII

该文章代码均在gitee中开源 C智能指针hpphttps://gitee.com/Ehundred/cpp-knowledge-points/tree/master/%E6%99%BA%E8%83%BD%E6%8C%87%E9%92%88​​​​​​​ 智能指针 传统指针的问题 在C自定义类型中&#xff0c;我们为了避免内存泄漏&#xff0c;会采用析构函数的方法释…

2023年末,软件测试面试题总结与分享

大家好&#xff0c;最近有不少小伙伴在后台留言&#xff0c;得准备年后面试了&#xff0c;又不知道从何下手&#xff01;为了帮大家节约时间&#xff0c;特意准备了一份面试相关的资料&#xff0c;内容非常的全面&#xff0c;真的可以好好补一补&#xff0c;希望大家在都能拿到…

分享Python采集40个NET整站程序源码,总有一款适合您

分享Python采集40个NET整站程序源码&#xff0c;总有一款适合您 Python采集的40个NET整站程序源码下载链接&#xff1a;https://pan.baidu.com/s/1z54JHJkFYa4Kx2oBtPrn_w?pwd2ta4 提取码&#xff1a;2ta4 商品评论网站系统 小孔子内容管理系统XkCms V2.0 友间别墅整站程…

实现二叉树的基本操作与OJ练习

目录 1.二叉树的基本操作 1.1二叉树基本操作完整代码 1.2检测value值是否存在 1.3层序遍历 1.4判断一棵树是不是完全二叉树 2.OJ练习 2.1平衡二叉树 2.2对称二叉树 2.3二叉树遍历 1.二叉树的基本操作 1.1二叉树基本操作完整代码 public class BinaryTree {static…

【Unity】【FBX】如何将FBX模型导入Unity

【背景】 网上能够找到不少不错的FBX模型资源&#xff0c;大大加速游戏开发时间。如何将这些FBX导入Unity呢&#xff1f; 【步骤】 打开Unity项目文件&#xff0c;进入场景。 点击Projects面板&#xff0c;右键选择Import New Assets 选中FBX文件后导入。Assets文件夹中就会…

Python 内置高阶函数练习(Leetcode500.键盘行)

Python 内置高阶函数练习&#xff08;Leetcode500.键盘行&#xff09; 【一】试题 &#xff08;1&#xff09;地址&#xff1a; 500. 键盘行 - 力扣&#xff08;LeetCode&#xff09; &#xff08;2&#xff09;题目 给你一个字符串数组 words &#xff0c;只返回可以使用在…

东方甄选小作文事件最大的赢家是谁? 董宇辉还是俞敏洪

有人说东方甄选小作文事件没有赢家&#xff0c;小马识途营销顾问认为小作文事件最终也没有输家。就公司来讲&#xff0c;有机会培养更多优秀主播&#xff0c;未来发展更健康了&#xff1b;就俞老师来讲&#xff0c;是把宇辉的薪酬和职位提高了&#xff0c;这些也是宇辉本来就应…

3D视觉-结构光测量-线结构光测量

概述 线结构光测量中&#xff0c;由激光器射出的激光光束透过柱面透镜扩束&#xff0c;再经过准直&#xff0c;产生一束片状光。这片光束像刀刃一样横切在待测物体表面&#xff0c;因此线结构光法又被成为光切法。线结构光测量常采用二维面阵 CCD 作为接受器件&#xff0c;因此…

模型 安索夫矩阵

本系列文章 主要是 分享模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。产品市场战略。 1 安索夫矩阵的应用 1.1 江小白的多样化经营策略 使用安索夫矩阵来分析江小白市场战略。具体如下&#xff1a; 根据安索夫矩阵&#xff0c;江小白的现有产品是其白酒产品&…

【23.12.30期--Spring篇】Spring的AOP介绍(详解)

Spring的AOP介绍 ✔️简述✔️扩展知识✔️AOP是如何实现的 ✔️简述 AOP(Aspect-Oriented Programming)&#xff0c;即面向切面编程&#xff0c;用人话说就是把公共的逻辑抽出来&#xff0c;让开发者可以更专注于业务逻辑开发。 和IOC-样&#xff0c;AOP也指的是一种思想。AOP…

Android APK未签名提醒

最近新建了一个项目&#xff0c;在build.gradle中配置好了签名&#xff0c;在执行打包的时候打出的包显示已签名&#xff0c;但是在上传市场的时候提示未签名。于是排查了好久&#xff0c;发现在build.gradle中配置的minsdk 24&#xff0c;会导致不使用V1签名&#xff0c;于是我…

【洛谷学习自留】p7621 超市购物

2023/12/29 解题思路&#xff1a; 简单的计算&#xff0c;难度主要集中在格式化输出和四舍五入的问题上。 1.建立一个计数器&#xff0c;for循环遍历单价和数量的乘积&#xff0c;存入计数器。 2.计算计数器的最终值乘以0.85h后的结果&#xff0c;为了保证四舍五入正确&…

小程序入门-登录+首页

正常新建一个登录页面 创建首页和TatBar&#xff0c;实现登录后底部出现两个按钮 代码 "pages": ["pages/login/index","pages/index/index","pages/logs/logs" ],"tabBar": {"list": [{"pagePath"…
最新文章