贪心算法思路总结及其java实现

1. 贪心算法条件与思路的解题步骤

1.一次性:某个状态以后的过程不会影响以前的状态,只与当前状态有关。
2.局部最优集合能得到全局最优。
(如果某次选择会对之后选择产生影响,局部最优不能获得全局最优可以直接KO贪心思路)
第一步,判断是否属于贪心算法的情况:对一组数据加了一定的限制,希望从中选出几个数据,在满足限制值的情况下,达到最大期望值。
第二步,用简单例子检测贪心算法是否最优。

2.贪心算法的分类

依据个人经验分成了三大类
1.分饼干,跳跃游戏,环绕加油站等每次从最小的开始分配

从问题的某一初始解出发;
    while (到达目标边界)
    {
         if(该阶段的状态满足最优条件)加入此局部最优解;
          进入下一阶段;
    }
    return 由所有解元素组合成问题的一个可行解;

  1. 教师排课器,任务调度等区间覆盖的问题
    选择几个不相交的区间,从左到右将[lmin, rmax]覆盖上。按照起始端从小到大对这 n 个区间排序。
    每次选择:左端点跟前面已覆盖区间不重合的、尽量小的区间,这样可以让剩下的未覆盖区间尽可能的大,就可以放置更多的区间。
  2. 背包价值和钱币找零问题
    贡献相同期望值的情况下,每次价值越大,总体的数量/重量就更少

注:求最小生成树的Prim算法和Kruskal算法都是漂亮的贪心算法。

leetcode里贪心算法的代码实现

1.简单题455分发饼干
import java.util.Arrays;

 public class AssignCookie{
   
     public static int contentChildren(int[]g,int[]s){
   
         assert g.length>0||s.length>0;
         Arrays.sort(g);
         Arrays.sort(s);
         //定义第i个小孩的appetite对应第j块饼干
         int i=0,j=0;
         //当小孩没满足完或饼干没发完
         while(i<g.length&&j<s.length){
   
             if(g[i]<=s[j])
                 i++;
             j++;
         }
         //被满足的小孩个数
         return i;
     }
 }
中等题134. 加油站
/**
 *在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
 * 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
 * 如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。
 */
public class GasStation {
   
    /**
     *一旦遇到第一个无法到达的点 i,直接更换起始点为 i+1。中间的 [1,i-1] 的点一定不是起始点
     * @param gas
     * @param cost
     */
    public int canCompleteCircuit(int[
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值