代码随想录刷题03.12
贪心算法1
贪心算法简介
1.核心算法:从局部最优——>推导出全局最优
2.方法论:贪心算法是一种“以小见大”的思想,没有具体的方法套路。
3.解题思路:
1)分析题目中的单体个例是什么(for循环将全局问题转化到单体个例上);
2)分析局部最优是什么情况?(这个具体问题具体分析,体现贪心“以小见大”的思想)。
LeetCode题目
解题思路
1.贪心算法本身并没有固定的策略,它是一种以局部最优得到整体最优的思路,仅仅是一种思路而已,具体的实现过程要依赖其他解题思路,比如数组双指针等等;
2.for循环可以将整体化为局部;
3.本题的贪心思路:用较小的饼干去满足较小胃口的孩子 或者 较大胃口的孩子用较大的饼干来满足。
4.双指针法的关键:理清楚谁是快指针(快指针走的快,其所代表的初始值是可以被遗弃的),谁是慢指针(慢指针走的慢,其所代表的初始值不会被遗弃)。
代码过程
class Solution {
public:
int result=0;
//int gpoint=0;
int spoint=0;
int findContentChildren(vector<int>& g, vector<int>& s) {
if(s.size()==0||g.size()==0)return 0;
sort(g.begin(),g.end());
sort(s.begin(),s.end());
spoint=s.size()-1;
/*for(int i=0;i<s.size();i++)
{
if(gpoint<g.size()&&g[gpoint]<=s[i]){
gpoint++;
result++;
}
}*/
for(int i=g.size()-1;i>-1;i--)
{
if(spoint>=0&&s[spoint]>=g[i]){
result++;
spoint--;
}
}
return result;
}
};
LeetCode题目
解题思路
1.贪心算法是"以小见大",因此,在写代码时,主要从个体单例出发进行考虑,但是要注意个体单例应越详尽越好,要能完整凸显出满足全局要求的个体单例的独特特征。
2.本题最开始采用cur✖️pre<=0来作为个体单例子的判断标准,但会发现这种判断标准无法满足存在平坡的情况,即无法满足全局要求,将判断标准进一步精细化后,就可以逐渐逼近全局要求。
代码过程
class Solution {
public:
int count=1;;
int wiggleMaxLength(vector<int>& nums) {
if(nums.size()==1)return count;
int pre=0;
for(int i=0;i<nums.size()-1;i++)
{
int cur=nums[i+1]-nums[i];
if((pre>=0&&cur<0)||(pre<=0&&cur>0)){
count++;
pre=cur;
}
}
return count;
}
};
LeetCode题目
解题思路
1.贪心算法小结:用for循环制造出能满足全局要求的单体个例,如果涉及到最值问题,还要辅以一定的解题策略;
2.本题思路:
1)本题的单体个例是数组中的元素;
2)涉及到最值问题:当数组元素前面的累加和小于0时,则累加和清零,重新开始累加;最大值并不是时时更新,而是不断与累加和比较,取最大值。
代码过程
class Solution {
public:
int result=INT_MIN;
int count=0;
int maxSubArray(vector<int>& nums) {
for(int i=0;i<nums.size();i++)
{
count+=nums[i];
result=result>count?result:count;
if(count<=0)count=0;
}
return result;
}
};