贪心算法理论基础
刷题或者面试的时候,手动模拟一下感觉可以局部最优推出整体最优,而且想不到反例,那么就试一试贪心。贪心算法并没有固定的套路。
455.分发饼干
题目讲解:代码随想录
贪心:可以选大饼干喂给大胃口的孩子,也可以小饼干喂给小胃口的孩子。
class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int child=0;
for(int i=0; i<s.length; i++){
if(child<g.length && g[child]<=s[i])
child++;
}
return child;
}
}
376. 摆动序列
题目讲解:代码随想录
贪心:想不出来,看讲解感觉好聪明,以后也可以试试画图找规律(?)
class Solution {
public int wiggleMaxLength(int[] nums) {
if(nums.length<2)
return nums.length;
int prediff=0, curdiff=0;
int ans=1;
for(int i=1; i<nums.length; i++){
curdiff=nums[i]-nums[i-1];
//只有刚进入序列时差值可能是0,所以只有prediff要考虑=0的情况
if((curdiff<0 && prediff>=0) || (curdiff>0 && prediff<=0)){
ans++;
prediff=curdiff;
}
}
return ans;
}
}
53. 最大子序和
题目链接:53. 最大子数组和 - 力扣(LeetCode)
题目讲解:代码随想录
贪心:主要是没想清楚什么时候需要重新开始计算,应该是curnum+num[i]<nums[i]的时候,就从头开始。
class Solution {
public int maxSubArray(int[] nums) {
int maxnum=-10000;
int curnum=-10000;
for(int i=0; i<nums.length; i++){
curnum+=nums[i];
if(curnum<nums[i])
curnum=nums[i];
if(curnum>maxnum)
maxnum=curnum;
}
return maxnum;
}
}