数据结构与算法——贪心算法

文章目录

        • 1.分发饼干
          • 1.1 题目描述
          • 1.2 解题思路
          • 1.3 C++实现
        • 2.摆动序列
          • 2.1 题目描述
          • 2.2 解题思路
          • 2.3 C++实现
        • 3.移掉K位数字
          • 3.1 题目描述
          • 3.2 解题思路
          • 3.3 C++实现
        • 4.跳跃游戏
          • 4.1 题目描述
          • 4.2 解题思路
          • 4.3 C++实现
        • 5.跳跃游戏 II
          • 5.1 题目描述
          • 5.2 解题思路
          • 5.3 C++实现
        • 6.用最少数量的箭引爆气球
          • 6.1 题目描述
          • 6.2 解题思路
          • 6.3 C++实现
        • 7.最优加油方法
            • 7.1 题目描述
          • 7.2 解题思路
          • 7.3 C++实现

1.分发饼干

1.1 题目描述

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。

对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。

题目来源于力扣455

1.2 解题思路

在这里插入图片描述
在这里插入图片描述

1.3 C++实现
class Solution {
public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(),g.end());sort(s.begin(),s.end());int child=0;int cookie=0;while((child<g.size())&&(cookie<s.size())){if(g[child]<=s[cookie]){child++;}cookie++;}return child;}
};

2.摆动序列

2.1 题目描述

如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。

例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。

给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(也可以不删除)元素来获得子序列,剩下的元素保持其原始顺序。

2.2 解题思路

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

2.3 C++实现
class Solution {
public:int wiggleMaxLength(vector<int>& nums) {if(nums.size()<2){return nums.size();}static const int BEGIN=0;static const int UP=1;static const int DOWN=2;int STATE=BEGIN;int max_length=1;for(int i=1;i<nums.size();i++){switch(STATE){case BEGIN:if(nums[i]>nums[i-1]){STATE=UP;max_length++;}else if(nums[i]<nums[i-1]){STATE=DOWN;max_length++;}break;case UP:if(nums[i]<nums[i-1]){STATE=DOWN;max_length++;}break;case DOWN:if(nums[i]>nums[i-1]){STATE=UP;max_length++;}break;}            }return max_length;}
};

3.移掉K位数字

3.1 题目描述

给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。

num 的长度小于 10002 且 ≥ k。
num 不会包含任何前导零。

3.2 解题思路

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.3 C++实现
class Solution {
public:string removeKdigits(string num, int k) {vector<int> S;string result="";for(int i=0;i<num.length();i++){int number=num[i]-'0';while(S.size()!=0&&S[S.size()-1]>number&&k>0){S.pop_back();k--;}if(S.size()!=0||number!=0){S.push_back(number);}}while(S.size()!=0&&k>0){S.pop_back();k--;}for(int i=0;i<S.size();i++){result.append(1,'0'+S[i]);}if(result==""){return "0";}return result;}
};

4.跳跃游戏

4.1 题目描述

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标。

4.2 解题思路

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4.3 C++实现
class Solution {
public:bool canJump(vector<int>& nums) {vector<int> index;for(int i=0;i<nums.size();i++){index.push_back(i+nums[i]);}int max_index=index[0];int jump=0;while(jump<index.size()&&jump<=max_index){if(max_index<index[jump]){max_index=index[jump];}jump++;}if(jump==nums.size()){return true;}return false;}
};

5.跳跃游戏 II

5.1 题目描述

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

5.2 解题思路

在这里插入图片描述

5.3 C++实现
class Solution {
public:int jump(vector<int>& nums) {if(nums.size()<2){return 0;}int current_max_index=nums[0];int pre_max_max_index=nums[0];int jump=1;for(int i=0;i<nums.size();i++){if(i>current_max_index){jump++;current_max_index=pre_max_max_index;}if(pre_max_max_index<nums[i]+i){pre_max_max_index=nums[i]+i;}}return jump;}
};

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

6.1 题目描述

在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以纵坐标并不重要,因此只要知道开始和结束的横坐标就足够了。开始坐标总是小于结束坐标。

一支弓箭可以沿着 x 轴从不同点完全垂直地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被引爆。可以射出的弓箭的数量没有限制。 弓箭一旦被射出之后,可以无限地前进。我们想找到使得所有气球全部被引爆,所需的弓箭的最小数量。

给你一个数组 points ,其中 points [i] = [xstart,xend] ,返回引爆所有气球所必须射出的最小弓箭数。

6.2 解题思路

在这里插入图片描述
在这里插入图片描述

6.3 C++实现
class Solution {
public:int findMinArrowShots(vector<vector<int>>& points) {if(points.size()==0){return 0;}sort(points.begin(),points.end());int shoot_num=1;int shoot_begin=points[0][0];int shoot_end=points[0][1];for(int i=1;i<points.size();i++){if(shoot_end>=points[i][0]){shoot_begin=points[i][0];if(shoot_end>points[i][1]){shoot_end=points[i][1];}}else{shoot_num++;shoot_begin=points[i][0];shoot_end=points[i][1];}}return shoot_num;}
};

7.最优加油方法

7.1 题目描述

在这里插入图片描述

7.2 解题思路

在这里插入图片描述在这里插入图片描述

7.3 C++实现
#include <iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;bool cmp(pair<int, int>& a, pair<int, int>& b) {return a.first > b.first;
}int get_min_stop(int L, int P, vector < pair<int, int>>& stop)
{priority_queue<int> Q;int result = 0;stop.push_back(make_pair(0, 0));sort(stop.begin(), stop.end(), cmp);for (int i = 0; i < stop.size(); i++) {int dis = L - stop[i].first;while (dis > P && !Q.empty()) {P = P + Q.top();Q.pop();result++;}if (Q.empty() && dis > P) {return -1;}P = P - dis;L = stop[i].first;Q.push(stop[i].second);}return result;
}
int main()
{vector<pair<int,int>> stop;int L, P;L = 25;P = 10;stop.push_back(make_pair(4, 4));stop.push_back(make_pair(5, 2));stop.push_back(make_pair(11, 5));stop.push_back(make_pair(15, 10));cout << "加油次数:" << get_min_stop(L, P, stop) << endl;return 0;
}

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

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

相关文章

人为什么要睡觉?科学家给出进一步答案

来源&#xff1a;科技日报作者&#xff1a;张佳欣 人类一生中有三分之一的时间在睡觉&#xff0c;包括苍蝇、蠕虫甚至水母等无脊椎动物也会睡觉。在整个进化过程中&#xff0c;睡眠对所有具有神经系统的有机体来说都是普遍的&#xff0c;也是必不可少的。然而你有没有想过&…

操作系统——简介

文章目录1.操作系统的功能和目标1.1 作为用户和计算机硬件之间的接口1.2 作为系统资源的管理者1.3 作为最接近硬件的层次2.操作系统的概念、功能和目标3.操作系统的四大特征3.1 并发3.2 共享3.3 虚拟3.4 异步4.操作系统的运行机制4.1 两种指令4.2 两种处理器状态4.3 两种程序5.…

Andrew Gelman、Aki Vehtari​ | 过去50年最重要的统计学思想是什么?

来源&#xff1a; 数据分析网作者 &#xff1a;Andrew Gelman 美国统计学家、哥伦比亚大学统计学教授Aki Vehtari 阿尔托大学计算机科学系副教授近日&#xff0c;图灵奖得主、“贝叶斯网络之父”Judea Pearl在Twitter上分享了一篇新论文“What are the most important statis…

全局唯一ID的生成

数据在分片时&#xff0c;典型的是分库分表&#xff0c;就有一个全局ID生成的问题。单纯的生成全局ID并不是什么难题&#xff0c;但是生成的ID通常要满足分片的一些要求&#xff1a; 1 不能有单点故障。 2 以时间为序&#xff0c;或者ID里包含时间。这样一是可以少一个索引…

操作系统——进程

文章目录1.进程的定义2.进程的组成3.PCB4.进程的状态4.1 进程的五种状态4.2 进程状态间的转换5.进程控制6.进程通信6.1 共享存储6.2 管道通信6.3 消息传递7.线程7.1 线程的概念7.2 引入线程后的变化7.3 线程的属性7.4 线程的实现方式7.4.1 用户级线程7.4.2 内核级线程7.4.3 混合…

10分钟了解图卷积神经网络的常用算法和发展方向

来源&#xff1a;数学算法俱乐部近几年&#xff0c;机器学习在各个领域井喷式发展&#xff0c;现已成为当下最热门的技术。掌握机器学习&#xff0c;你就比 80% 的人更具备竞争优势。谷歌的无人驾驶、抖音的推荐系统、百度的人脸识别、大疆的无人机、科大讯飞的语音识别、小米的…

操作系统——调度

文章目录1.调度的概念2.调度的三个层次2.1 高级调度2.2 中级调度2.3 低级调度2.4 三种调度之间的关联1.调度的概念 2.调度的三个层次 2.1 高级调度 2.2 中级调度 2.3 低级调度 2.4 三种调度之间的关联

诺奖得主被曝40多篇论文造假!

来源&#xff1a;科研城邦截止2021年11月6日&#xff0c;Gregg L. Semenza教授针对其在Pubpeer被挂的52篇论文&#xff0c;进行了至少6篇文章的纠正&#xff0c;且撤回了1篇文章。离谱的是&#xff0c;这位美国约翰霍普金斯大学教授&#xff0c;正是2019年诺贝尔生理学或医学奖…

操作系统——死锁

文章目录1.死锁的概念2.死锁产生的必要条件3.什么时候会发生死锁4.死锁的处理策略4.1 预防死锁4.1.1 破坏互斥条件4.1.2 破坏不剥夺条件4.1.3 破坏请求和保持条件4.1.4 破坏循环等待条件4.2 避免死锁4.2.1 安全序列4.2.2 银行家算法1.死锁的概念 2.死锁产生的必要条件 3.什么时…

苏联的三进制电脑,为什么被二进制干掉了?

来源&#xff1a;差评 当我们在电脑上打开一个软件&#xff0c;看一部电影&#xff0c;听一首歌的时候&#xff0c;我们很难想象&#xff0c;这些东西都是由 0 和 1 这样的二进制数字组成的。但你有没有好奇过&#xff1f;为什么计算机要用二进制呢&#xff1f;难道是因为它效…

linux标准I/O——标准I/O介绍

文章目录1.文件的相关概念1.1 什么是文件1.2 文件类型2.标准I/O概念2.1 什么是标准I/O2.2 FILE和流2.3 流的缓冲类型2.4 stdin&#xff0c;stdout和stderr1.文件的相关概念 1.1 什么是文件 \qquad一组相关数据的有序集合 1.2 文件类型 文件类型表示举例常规文件r文本文件、二…

70页论文,图灵奖得主Yoshua Bengio一作:「生成流网络」拓展深度学习领域

来源&#xff1a;机器学习研究组订阅GFlowNet 会成为新的深度学习技术吗&#xff1f;近日&#xff0c;一篇名为《GFlowNet Foundations》的论文引发了人们的关注&#xff0c;这是一篇图灵奖得主 Yoshua Bengio 一作的新研究&#xff0c;论文长达 70 页。在 Geoffrey Hinton 的「…

linux标准I/O——流的打开和关闭

文章目录1.打开流2.mode参数3.fopen举例4.新建文件权限5.处理错误信息6.关闭流1.打开流 2.mode参数 3.fopen举例 #include<stdio.h> int main() {FILE *fp;fpfopen("a.txt","r");if(fpNULL){printf("fopen error\n");return -1;}return 0…

卷积神经网络数学原理解析

来源&#xff1a;海豚数据科学实验室作 者&#xff1a;Piotr Skalski翻 译&#xff1a;通夜&#xff08;中山大学&#xff09;、had_in&#xff08;电子科技大学&#xff09;编 辑&#xff1a;Pita 原标题&#xff1a;Gentle Dive into Math Behind Convolutional Neural N…

【大数据】分布式集群部署

1、集群规划部署 节点名称NN1NN2DN RMNMhadoop01NameNode DataNode NodeManagerhadoop02 SecondaryNameNodeDataNodeResourceManagerNodeManagerhadoop03 DataNode NodeManager2、参考单机部署&#xff0c;拷贝安装目录至相同目录&#xff0c;使用ln -s 建立软连接 3、修改配置…

linux标准I/O——按字符输入和输出

文章目录1.流的读写方式2.按字符输入3.举例3.1 从键盘读取一个字符&#xff0c;并打印到终端上3.2 读取一个文件&#xff0c;并打印文件中的字符数目3.3 自行输入要查看的文件&#xff0c;并打印文件中的字符数目4.按字符输出5.举例5.1 从键盘读入&#xff0c;并打印到终端5.2 …

周志华教授:关于深度学习的一点思考

来源&#xff1a;专知1 引言 深度学习已被广泛应用到涉及图像、视频、语音等的诸多任务中并取得巨大成功。如 果我们问“深度学习是什么&#xff1f;”很可能会得到这样的回答&#xff1a;“深度学习就是深度神经网 络”。至少在目前&#xff0c;当“深度学习”作为一个术语时几…

linux标准I/O——按行输入和输出

文章目录1.按行输入函数2.从键盘读入&#xff0c;并打印3.按行输出4.键盘输入字符串&#xff0c;写入文本5.将文本中的字符串按行读出到buf中&#xff0c;并打印buf1.按行输入函数 2.从键盘读入&#xff0c;并打印 #include<stdio.h> #include<string.h>#define N…

IEEE发布2022年科技趋势全球调研:人工智能和机器学习、云计算及5G将成为下一年最重要的技术...

来源&#xff1a;IEEE电气电子工程师近日&#xff0c;全球最大的专业技术组织IEEE&#xff08;电气电子工程师学会&#xff09;发布了《IEEE全球调研&#xff1a;科技在2022年及未来的影响》。根据本次调研结果显示&#xff0c;人工智能和机器学习、云计算及5G技术将成为影响20…

linux标准I/O——按对象输入和输出

文章目录1.按对象操作函数1.按对象操作函数