算法篇------贪心1
创始人
2024-01-29 12:01:28

文章目录

    • 贪心的概念
    • 题目1------经典的选择排序(简单)
    • 题目2----平衡字符串(简单)
    • 题目3---买卖股票的最佳时间(中等)
    • 题目4------跳跃游戏(中等)
    • 题目5-------钱币找零
    • 题目6------多机调度的问题

贪心的概念

什么是贪心算法?
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择不从整体
最优上加以考虑
,他所做出的是在某种意义上的局部最优解

举个例子:
你现在非常非常饿, 去食堂买了5,6个菜。每次都优先吃完最好吃的那一份菜,然后算吃完所有的菜。
你的任务:就是吃完所有的菜。 解决问题的方式:优先吃最好吃的。

题目1------经典的选择排序(简单)

为什么说它是一种贪心算法呢?
因为每次都是选择最大值或者最小值以达到排序的目的。

下面代码可以适度优化一下,同时找最小值和最大值,放在数组的两端。
不过要注意的是,交换的时候可能会出现 “位置重叠”
代码:

void SelectSort(int* arr, int n)
{for (int i = 0; i < n; i++){int maxi = i;for (int j = i + 1; j < n; j++){if (arr[maxi] < arr[j])maxi = j;}swap(arr[i], arr[maxi]);}
}

题目2----平衡字符串(简单)

力扣:平衡字符串
解题思路:优先遇到平衡则计数加1.
为什么是贪心算法呢? 因为只考虑局部,不用考虑整体。
也就是说,我每遇到一对平衡字符串,则计数加1。

代码:

class Solution 
{
public:int balancedStringSplit(string s) {int balance = 0, count = 0;for(int i = 0; i < s.size(); i++){if(s[i] == 'R')balance++;elsebalance--;if(balance == 0)count++;}return count;}
};

题目3—买卖股票的最佳时间(中等)

在这里插入图片描述

class Solution {
public:int maxProfit(vector& prices) {int maxprofit = 0;for(int i = 0; i < prices.size() - 1; i++){if(prices[i] < prices[i + 1]){maxprofit += prices[i + 1] - prices[i];}}return maxprofit;}
};

题目4------跳跃游戏(中等)

力扣:跳跃游戏

为什么跳跃游戏是贪心呢?
因为只用考虑当前下标位置跳跃的最远距离,能不能跳过整个数组。
通过一列当前位置的跳跃来求解总问题。

代码:

class Solution {
public:bool canJump(vector& nums) {int len = nums.size();int maxdis = 0; //定义的下标位置for(int i = 0; i < len; i++){if(i <= maxdis) // 表示可以到达下标i的位置,如果不能到达就没有必要了{maxdis = max(maxdis, i + nums[i]);}if(maxdis >= len - 1)return true;}return false;}
};

题目5-------钱币找零

假设1元、2元、5元、10元、20元、50元、100元的纸币分别有c0, c1, c2, c3, c4, c5, c6张。现在要用这些钱来支付K
元,至少要用多少张纸币?

为什么是贪心呢?
每次都找到最大面额的钱,通过一系列局部的最优解来解决总问题

class Sort
{
public:bool operator()(vector a, vector b){return a[0] > b[0];         //按照二维数组中一维数组第一个元素排升序}
};int get_money_num(const vector>& vv, int money)
{int num = 0;	for (int i = 0; i < vv.size(); i++){int cnt = min(money / vv[i][0], vv[i][1]);money -= cnt * vv[i][0];num += cnt;if (money == 0)return num;}	return -1;
}int main()
{vector> vv = { {10,5}, {100,4}, {20, 3} , {5, 6}, {1, 10}, {50,5 } };sort(vv.begin(), vv.end(), Sort());  int money = 0;while (cin >> money){int ret = get_money_num(vv, money);if (ret == -1){cout << "无法找零" << endl;}else{cout << ret << endl;}}return 0;
}

题目6------多机调度的问题

某工厂有n个独立的作业,由m台相同的机器进行加工处理。作业i所需的加工时间为ti,任何作业在被处理时不能中
断,也不能进行拆分处理。现厂长请你给他写一个程序:算出n个作业由m台机器加工处理的最短时间
输入
第一行T(1 1<=m<=100),接下来的一行是n个整数ti(1<=t<=100)。

解题思路:
分两种情况
1, m >= n 取n个作业中执行时间最长的即可
2, m < n 先将 m 个作业分配给m个机器, 然后每次从剩余的作业中找到最长执行时间的
作业,将它分配给m个机器中耗时最小的哪个机器。
例如:

在这里插入图片描述

为什么是贪心呢? 因为每次都需要去找最长时间的作业放到最快执行完的机器中。
通过一系列的局部最优达到总体最优。

代码分享:

//数组v以按降序排列
int get_min_time(vector& v, int n, int m)
{if (n <= m){return v[0];}vector ans( v.begin(), v.begin() + m);for (int i = m; i < v.size(); i++){int minindex = 0;  //每次找到耗费时间最少的哪个机器下标for (int j = 1; j < m; j++){if (ans[j] < ans[minindex])minindex = j;}ans[minindex] += v[i];}int max = ans[0];for (int i = 1; i < m; i++){if (ans[i] > max)max = ans[i];}return max;
}

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
平遥古城在哪 平遥古城基本现状 城垣恢宏,雉堞连云市井街巷,店肆林立四合院落,青砖瓦屋这里是平遥古城历经千年沧桑而古朴宛然,风姿依旧...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
平遥古城在哪 平遥古城基本现状 城垣恢宏,雉堞连云市井街巷,店肆林立四合院落,青砖瓦屋这里是平遥古城历经千年沧桑而古朴宛然,风姿依旧...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...