贪心算法
基础
贪心的本质是选择每一阶段的局部最优,从而达到全局最优。
贪心算法只要想清楚 局部最优 是什么,如果推导出全局最优
Leecode习题
455.分发饼干
小饼干给胃口小的孩子
是先遍历的胃口,在遍历的饼干
class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int child =0;
int cooky = 0;
while(child<g.length&&cooky<s.length){
if(g[child]<=s[cooky++]){
child++;
}
}
return child;
}
}
376. 摆动序列
class Solution {
public int wiggleMaxLength(int[] nums) {
int down =1;
int up =1;
for(int i=1;i<nums.length;i++){
if(nums[i]>nums[i-1]){
up = down+1;
}else if(nums[i]<nums[i-1]){
down = up+1;
}
}
return Math.max(down,up);
}
}
53. 最大子数组和
class Solution {
public int maxSubArray(int[] nums) {
int length = nums.length;
int[] dp = new int [length];
dp[0] = nums[0];
int sum = nums[0];
for(int i =1;i<length;i++){
if(dp[i-1]>0){
dp[i] = nums[i]+dp[i-1];
}else{
dp[i] = nums[i];
}
sum =sum>dp[i]? sum:dp[i];
}
return sum;
}
}
解法二:贪心算法
局部最优的情况下,并记录最大的“连续和”,可以推出全局最优。
从代码角度上来讲:遍历 nums,从头开始用 count 累积,如果 count 一旦加上 nums[i]变为负数,那么就应该从 nums[i+1]开始从 0 累积 count 了,因为已经变为负数的 count,只会拖累总和。
result 要初始化为最小负数(以防输入的数组全是负数)
class Solution {
public int maxSubArray(int[] nums) {
int count =0;
int res = Integer.MIN_VALUE;
for(int i=0;i<nums.length;i++){
count +=nums[i];
res = Math.max(res,count);
if(count<0){
count=0;
}
}
return res;
}
}