贪心的本质是选择每一阶段的局部最优,从而达到全局最优
贪心没有套路,说白了就是常识性推导加上举反例。
贪心算法一般分为如下四步:
- 将问题分解为若干个子问题
- 找出适合的贪心策略
- 求解每一个子问题的最优解
- 将局部最优解堆叠成全局最优解
分发饼干
class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int start=0;
for(int i=0;i<s.length;i++)
{
if(start<g.length&&s[i]>=g[start])
{
start++;
}
}
return start;
}
}
摆动序列
class Solution {
public int wiggleMaxLength(int[] nums) {
int pre=0;
int cur=0;
int count=1;
for(int i=0;i<nums.length-1;i++)
{
cur=nums[i+1]-nums[i];
if(cur>0&&pre<=0||cur<0&&pre>=0)
{
count++;
pre=cur;
}
}
return count;
}
}
最大子序和
class Solution {
public int maxSubArray(int[] nums) {
int result=Integer.MIN_VALUE;
int count=0;
for(int i=0;i<nums.length;i++)
{
count+=nums[i];
if(count>result) result=count;
if(count<=0) count=0;
}
return result;
}
}
买卖股票的最佳时机
class Solution {
public int maxProfit(int[] prices) {
int max=0;
for(int i=0;i<prices.length-1;i++)
{
if(prices[i+1]-prices[i]>0)
{
max+=prices[i+1]-prices[i];
}
}
return max;
}
}