目录

  • 例1:分糖果(easy)(排序、贪心)
  • 例2:摇摆序列(medium)(贪心)
  • 例3:移除K个数字(medium)(栈、贪心)
  • 例4-a:跳跃游戏(medium)(贪心)
  • 例4-b:跳跃游戏2(hard)(贪心)
  • 例5:射击气球(medium)(排序、贪心)
  • 例6:最优加油方法(hard)(堆、贪心)

例1:分糖果(easy)(排序、贪心)


class Solution {public:int findContentChildren(vector<int>& g, vector<int>& s) {std::sort(g.begin(),g.end());std::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:摇摆序列(medium)(贪心)


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;//至少为1for (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-1]>nums[i]){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个数字(medium)(栈、贪心)


class Solution {public:string removeKdigits(string num, int k) {std::vector<int>S;std::string result="";for (int i=0;i<num.size();i++){int number=num[i]-'0';while(S.size() !=0 && k>0 &&S[S.size()-1]>number){S.pop_back();k--;}if (number !=0 || S.size()!=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==""){result='0';}return result;}
};

例4-a:跳跃游戏(medium)(贪心)



class Solution {public:bool canJump(vector<int>& nums) {std::vector<int> index;//记录最远可跳至的位置for (int i = 0; i < nums.size(); i++) {index.push_back(i + nums[i]);//计算每个位置可以到达的最大距离}int jump = 0;//初始跳到的位置int max_index = index[0];//初始跳的步数while (jump < nums.size() && jump <= max_index) {//在可达情况下if (max_index < index[jump]) {//更新最大值max_index = index[jump];}jump++;//更新步数}if (jump == nums.size()) {return true;}return false;}
};
class Solution {public:bool canJump(vector<int>& nums) {int step = 1;//至少所需步长for (int i = nums.size() - 2; i >= 0; i--){if (nums[i] >= step){step = 1;  //因为nums[i]满足到达终点所需步长,所以只需要nums[i-1]可以到达nums[i-1]即可,重置step=1continue;}else{step++;  //nums[i]不满足到达终点所需步长,所以所需步长+1}}if (step == 1) return true;else return false;}
};
class Solution :def canJump(self, nums) :max_i = 0       #初始化当前能到达最远的位置for i, jump in enumerate(nums) : #i为当前位置,jump是当前位置的跳数if max_i >= i and i + jump > max_i:  #如果当前位置能到达,并且当前位置 + 跳数 > 最远位置max_i = i + jump  #更新最远能到达位置return max_i >= i

例4-b:跳跃游戏2(hard)(贪心)

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

例5:射击气球(medium)(排序、贪心)


bool cmp(const vector<int>& a, const vector<int>& b) {return a[0] < b[0];
}
class Solution {public:int findMinArrowShots(vector<vector<int>>& points) {if (points.size() == 0) {return 0;}//先将气球位置进行排序std::sort(points.begin(), points.end(), cmp);//记录弓箭手位置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 (points[i][0] <= shoot_end) {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;}
class Solution(object):def findMinArrowShots(self, points):""":type points: List[List[int]]:rtype: int"""if not points:return 0points.sort()shoot_num=1shoot_begin=points[0][0]shoot_end = points[0][1]for i in range(1,len(points)):if points[i][0]<=shoot_end:shoot_begin=points[i][1];if shoot_end>points[i][1]:shoot_end=points[i][1]else:shoot_num+=1shoot_begin=points[i][0]shoot_end=points[i][1]return shoot_num

例6:最优加油方法(hard)(堆、贪心)


bool cmp(const std::pair<int,int>& a, const std::pair<int,int>& b) {return a.first < b.first;
}// L为起点到终点的距离,P为起点初始的汽油量    pair<加油站至终点的距离, 加油站汽油量>
int get_min_stop(int L, int P, std::vector<std::pair<int, int>>& stop) {std::priority_queue<int> Q;//存储油量最大堆int result = 0;//记录加油数stop.push_back(std::make_pair(0, 0));std::sort(stop.begin(), stop.end(), cmp);for (int i = 0; i < stop.size(); i++) {int dis = L - stop[i].first;//需要加油的情况while (!Q.empty() && P < dis) {P += Q.top();//加油(之前加油站最大油量的油,即最大堆堆顶)Q.pop();result++;}//加油站没油可加且到不了终点距离if (Q.empty() && P < dis) {return -1;}P = P - dis;L = stop[i].first;Q.push(stop[i].second);}return result;
}

数据结构与算法——贪心算法汇总整理相关推荐

  1. JavaScript 算法 -- 贪心算法

    文章目录 贪心算法 例题一:分饼干 例题二:买卖股票的最佳时机 II 贪心算法 贪心算法是算法设计的一种方法. 期盼通过每个阶段的局部最优选择,从而达到全局的最优,但最后的结果不一定最优. 例题一:分 ...

  2. [python算法]贪心算法+实例

    目录 什么是贪心算法 应用实例 找零问题 背包问题 拼接数字问题 活动选择问题 什么是贪心算法 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择. 也就是说,不从整体最优上 ...

  3. 数据结构与算法 / 贪心算法

    一.诞生原因 有如下场景:针对一组数据,我们定义了限制值和期望值,希望从中选出几个数据,在满足限制值的情况下,期望值最大. 为了达到上述目的,贪心算法是其中的一个解决方案. 例如,路径选择问题,从 S ...

  4. 算法——贪心算法解0-1背包问题

    问题的描述 我们先根据一个贪心算法的经典应用实例,然后给出贪心算法的实现步骤与关键环节,最后给出C++代码求解0-1背包问题. 背包问题(Knapsack Problem):有NN件物品有一个承重(也 ...

  5. 部分背包的贪婪算法 java_使用JAVA实现算法——贪心算法解决背包问题

    packageBasePart;importjava.io.BufferedReader;importjava.io.FileInputStream;importjava.io.IOException ...

  6. 基础算法 —— 贪心算法

    [概述] 贪心算法是从问题的初始状态出发,通过若干次的贪心选择而得到的最优值的一种求解策略,即贪心策略. 简单来说,贪心策略是一种在每次决策时采取当前意义下最优策略的算法,做出的选择至少在某种约束条件 ...

  7. 算法 - 贪心算法(集合覆盖问题求解)

    1.穷举法 2.贪心算法 遍历集合的key,用当前key的value和allAreas去取交集),然后和(maxKey和allAreas的交集)比较大小,如果当前key的结合size大就把当前key赋 ...

  8. 基础算法 —— 贪心算法

    [概述] 贪心算法是从问题的初始状态出发,通过若干次的贪心选择而得到的最优值的一种求解策略,即贪心策略. 简单来说,贪心策略是一种在每次决策时采取当前意义下最优策略的算法,做出的选择至少在某种约束条件 ...

  9. 基础算法 -- 贪心算法

    题目描述: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易( ...

  10. C语言会场安排问题贪心算法,贪心算法解决会场安排问题多处最优服务次序问题(含源代码).doc...

    贪心算法解决会场安排问题多处最优服务次序问题(含源代码) 西 安年月日-,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源.每个活动i都有一个要求使用该资源 ...

最新文章

  1. 【swjtu】数字电路实验5_按键防抖动
  2. java 代码 设置环境变量_Java 配置环境变量教程
  3. 推荐一款非常强大的扒站工具
  4. Python界面 PyQT可视化开发(python3+PyQt5+Qt Designer)
  5. 程序员必须关注的技术趋势,内附PDF下载链接
  6. javaweb成长之路:SSM框架搭建
  7. 【英语学习】【WOTD】lacuna 释义/词源/示例
  8. Python实现C代码统计工具(一)
  9. 高精度室内外融合定位服务平台-“羲和”系统
  10. HTML下拉菜单代码实现
  11. PumpkinRaising靶机渗透
  12. HTML5制作斑马线表格,HTML_CSS,JavaScript和MooTools制作斑马纹表格,简单的斑马纹表格,如果页面 - phpStudy...
  13. 多目标、多阶段、多层次的强化学习合作方法
  14. bat命令修改文件夹的后缀名
  15. iOS文章 - 收藏集 - 掘金
  16. 微信语音转文字的体验报告
  17. C语言字符和数字相互转换(适用于0-9这10个数字)
  18. python是什么语言编写的程序称为_Python 学习(一)【Python语言简介-Python是什么】...
  19. 蜜蜂的群体决策:一万只蜜蜂如何投票选择最佳巢穴?
  20. UnrealEngine4(虚幻4)这次来真格的了

热门文章

  1. java 取上下文路径_取得上下文路径的方式(getContextPath)
  2. 安装centos7的电脑对比视频播放
  3. 样本方差的期望_如何理解方差和偏差
  4. 蓝桥杯2015 C语言大学B组 C/C++
  5. ~~并查集模板(数据结构)(附题目AcWing 836. 合并集合)
  6. C 库函数 - atoi() 字符串中的数字转换为一个整型
  7. C++ 数据结构第二章 ----- 线性表
  8. Anaconda安装后找不到conda.exe
  9. 【oracle】除数为0
  10. 子类调用父类构造器的几种情况