贪心算法
1. 简单贪心算法(常识问题)
到底什么是贪心算法:利用局部最优来推出全局最优就是核心
1.1 LeetCode第455题—分发饼干
局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩
class Solution {
public:
//我们要的结果是尽可能的将我们的饼干分发给更多的小孩,如果我们这么思考应该怎么想呢?
//尽可能让大饼干去满足大胃口的人
//局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩。
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(),g.end());
sort(s.begin(),s.end());
int index = s.size()-1;
int num = 0;
for(int i = g.size()-1;i>=0;--i)
{
if(index >= 0 && s[index] >= g[i])
{
num++;
index--;
}
}
return num;
}
};
1.2 LeetCode第1005题—K此取反后最大化的数组和
class Solution {
static bool cmp(int a,int b)
{
return abs(a) > abs(b);
}
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
//如果数组中所有的元素都是正数,那么我们应该尽可能的让最小的哪一个进行转换,
//如果数组中有负数,那么我们应该尽可能的让较小的负数来做这一次的转换
//这道题并没有让你返回下标,而是返回结果
sort(nums.begin(),nums.end(),cmp);
for(int i = 0;i<nums.size();++i)
{
if(nums[i] < 0 && k > 0)
{
nums[i] *= -1;
k--;
}
}
while(k--)
{
nums[nums.size()-1] *= -1;
}
int ret = 0;
for(int& e : nums)
{
ret += e;
}
return ret;
}
};
1.2 LeetCode第860题—柠檬水找零
因为5元既可以给10元的找钱,也可以给20元的找钱,但是10元的只能够给20元的找钱,所以我们尽可能的,在找20元的时候,优先把10元的找出去,这样才能够尽可能的给每一个人都把钱找了
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
//5元是不需要找零钱的,因为单价本身就是5元
//如果一上来就是超5元的,那么不需要继续下去了直接返回false
//5美元是万能的,所以我们在收到20美元的时候,应该尽可能的先把10元的用出去
int five = 0,ten = 0;
for(auto& bill : bills)
{
if(bill == 5)
{
five++;
}
else if(bill == 10)
{
if(five < 0)
return false;
ten++;
five--;
}
else
{
if(five > 0 && ten > 0)
{
five--;
ten--;
}
else if(five >= 3)
{
five -= 3;
}
else
{
return false;
}
}
}
return true;