贪心算法
算法解释
- 贪心算法或贪心思想采用贪心的策略,保证每次操作都是局部最优的,从而使最后得到的结果是全局最优的。
- 于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。
- 举一个最简单的例子:小明和小王喜欢吃苹果,小明可以吃五个,小王可以吃三个。已知苹 果园里有吃不完的苹果,求小明和小王一共最多吃多少个苹果。在这个例子中,我们可以选用的 贪心策略为,每个人吃自己能吃的最多数量的苹果,这在每个人身上都是局部最优的。又因为全局结果是局部结果的简单求和,且局部结果互不相干,因此局部最优的策略也同样是全局最优的策略。
分配问题
455. 分发饼干
-
题解
-
为了尽可能满足最多数量的孩子,从贪心的角度考虑,应该按照孩子的胃口从小到大的顺序依次满足每个孩子,且对于每个孩子,应该选择可以满足这个孩子的胃口且尺寸最小的饼干。
-
简而言之,这里的贪心策略是,给剩余孩子里最小饥饿度的孩子分配最小的能饱腹的饼干。
//排序加贪心 //因为两个数组都排序了,当前最小饥饿度的孩子不能满足,后面的孩子都不能满足,第二个数组的索引处的元素表示第几小的饼干 public int findContentChildren(int[] g, int[] s) { int child = 0; int cookie = 0; Arrays.sort(g); Arrays.sort(s); //child:记录索引和记录满足的孩子个数 //cookie:记录索引 while(child<g.length&&cookie<s.length){ //对于每一个小孩,找到满足胃口的最小饼干 if(g[child]<=s[cookie]) { child++; } cookie++; } return child; }
-
135. 分发糖果
-
定制规则:学生A和学生B左右相邻,A在B左边
- 左规则:当 ratingsB>ratingsA时,B的糖比 A 的糖数量多。即学生B对左边的学生A要满足左规则
- 右规则: 当 ratings_A>ratings_B时,A的糖比B的糖数量多。即学生A对右边的学生B要满足右规则
-
相邻的学生中,评分高的学生必须获得更多的糖果 等价于 所有学生满足左规则且满足右规则
-
这里的贪心策略就是,在每次遍历中,只考虑并更新相邻一 侧的大小关系。
public int candy(int[] ratings) {
int count = 0;
int[] grades = new int[ratings.length];
for(int i =0;i<grades.length;i++){
grades[i]=1;
}
//确保每个学生满足左规则
for(