食用指南:本文为作者刷题中认为有必要记录的题目
推荐专栏:每日刷题
♈️今日夜电波:悬溺—葛东琪
0:34 ━━━━━━️💟──────── 3:17
🔄 ◀️ ⏸ ▶️ ☰
💗关注👍点赞🙌收藏您的每一次鼓励都是对我莫大的支持😍
目录
贪心算法的理解
本文参考了一位大佬的题解,详细的介绍了贪心算法:链接
一、分发饼干
455. 分发饼干https://leetcode.cn/problems/assign-cookies/
题目描述:
示例 1:
输入: g = [1,2,3], s = [1,1] 输出: 1 解释: 你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。 虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。 所以你应该输出1。
示例 2:
输入: g = [1,2], s = [1,2,3] 输出: 2 解释: 你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。 你拥有的饼干数量和尺寸都足以让所有孩子满足。 所以你应该输出2.
提示:
1 <= g.length <= 3 * 104
0 <= s.length <= 3 * 104
1 <= g[i], s[j] <= 231 - 1
本题思路:
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 sum=0;
for(int i=g.size()-1;i>=0;i--)//从大往小尽量给
{
if(index>=0&&s[index]>=g[i])
{
index--;
sum++;
}
}
return sum;
}
};
二、K次取反后最大化的数组和
1005. K 次取反后最大化的数组和https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/
题目描述:
示例 1:
输入:nums = [4,2,3], k = 1 输出:5 解释:选择下标 1 ,nums 变为 [4,-2,3] 。
示例 2:
输入:nums = [3,-1,0,2], k = 3 输出:6 解释:选择下标 (1, 2, 2) ,nums 变为 [3,1,0,2] 。
示例 3:
输入:nums = [2,-3,-1,5,-4], k = 2 输出:13 解释:选择下标 (1, 4) ,nums 变为 [2,3,-1,5,4] 。
提示:
1 <= nums.length <= 104
-100 <= nums[i] <= 100
1 <= k <= 104
本题思路:
暴力思想解法:
class Solution {
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
for(int i=0;i<k;i++)
{
sort(nums.begin(),nums.end());
nums[0]*=-1;
}
int result=0;
for (int i=0;i<nums.size();i++)
{
result+=nums[i];
}
return result;
}
};
虽然但是,这篇文章学的是贪心思想啊,我们还是要用贪心来写的!!!
贪心思想解法:
class Solution {
static bool cmp(int a, int b) {
return abs(a) > abs(b);
}
public:
int largestSumAfterKNegations(vector<int>& A, int K) {
sort(A.begin(), A.end(), cmp); // 第一步
for (int i = 0; i < A.size(); i++) { // 第二步
if (A[i] < 0 && K > 0) {
A[i] *= -1;
K--;
}
}
if (K % 2 == 1) A[A.size() - 1] *= -1; // 第三步
int result = 0;
for (int a : A) result += a; // 第四步
return result;
}
};
三、柠檬水找零
860. 柠檬水找零https://leetcode.cn/problems/lemonade-change/
题目描述:
示例 1:
输入:bills = [5,5,5,10,20] 输出:true 解释: 前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。 第 4 位顾客那里,我们收取一张 10 美元的钞票,并返还 5 美元。 第 5 位顾客那里,我们找还一张 10 美元的钞票和一张 5 美元的钞票。 由于所有客户都得到了正确的找零,所以我们输出 true。
示例 2:
输入:bills = [5,5,10,10,20] 输出:false 解释: 前 2 位顾客那里,我们按顺序收取 2 张 5 美元的钞票。 对于接下来的 2 位顾客,我们收取一张 10 美元的钞票,然后返还 5 美元。 对于最后一位顾客,我们无法退回 15 美元,因为我们现在只有两张 10 美元的钞票。 由于不是每位顾客都得到了正确的找零,所以答案是 false。
提示:
1 <= bills.length <= 105
bills[i]
不是5
就是10
或是20
本题思路:
class Solution {
public:
int five;
int ten;
int twenty;
public:
bool lemonadeChange(vector<int>& bills) {
for(int bill:bills)
{
if(bill==5)//情况1
{
five++;
}
if(bill==10)//情况2
{
if (five <= 0) return false;
ten++;
five--;
}
if(bill==20)//情况3
{
if(ten>0&&five>0)
{
ten--;
five--;
}else if(five>=3)
{
five-=3;
}else
{
return false;
}
}
}
return true;
}
};
感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o!
给个三连再走嘛~