思路:求解问题时,老是选当前最好的选择,不从总体上考虑。于是选用贪心算法必须保证当前选的最好的一定是总体最好的
。html
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。可是,每一个孩子最多只能给一块饼干。对每一个孩子 i ,都有一个胃口值 gi ,这是能让孩子们知足胃口的饼干的最小尺寸;而且每块饼干 j ,都有一个尺寸 sj 。若是 sj >= gi ,咱们能够将这个饼干 j 分配给孩子 i ,这个孩子会获得知足。你的目标是尽量知足越多数量的孩子,并输出这个最大数值。
假设输入[1,2], [1,2,3]
,那么输出为2
。分析以下算法
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int i=0;
int j=0;
int num=0;
while(i<g.length && j<s.length){
if(s[j]>=g[i]){
num++;
i++;
j++;
}else{
j++;
}
}
return num;
}
复制代码
给定一个用字符数组表示的 CPU 须要执行的任务列表。其中包含使用大写的 A - Z 字母表示的26 种不一样种类的任务。任务能够以任意顺序执行,而且每一个任务均可以在 1 个单位时间内执行完。CPU 在任何一个单位时间内均可以执行一个任务,或者在待命状态。数组
然而,两个相同种类的任务之间必须有长度为 n 的冷却时间,所以至少有连续 n 个单位时间内 CPU 在执行不一样的任务,或者在待命状态。bash
你须要计算完成全部任务所须要的最短期。
假如输入 tasks = ['A','A','A','B','B','B'], n = 2
输出为8
,执行顺序: A -> B -> (待命) -> A -> B -> (待命) -> A -> B
。分析以下cookie
贪心的选择执行n个不同的任务
,使得CPU可以充分利用public int leastInterval(char[] tasks, int n) {
int[] taskArr=new int[26];
for(char c:tasks){
taskArr[c-'A']++;
}
int maxLength=n;
int interval=0;
while (havaTask(taskArr)){
//先执行任务数最多的任务
int top = getTopTaskNotExecute(taskArr,Collections.emptyList());
interval++;
List<Integer> list = new ArrayList<>();
list.add(top);
for (int i=0;i<maxLength;i++)
{
//贪心的选择没有执行过的‘n’个任务最多并且没有执行过的任务
Integer nextTop = getTopTaskNotExecute(taskArr, list);
if (nextTop==-1){
maxLength=list.size()-1;
break;
}
interval++;
list.add(nextTop);
}
if (list.size()-1!=n && havaTask(taskArr)){
interval+=n-list.size()+1;
}
}
return interval;
}
public boolean havaTask(int[] tasks){
for(int i=0;i<tasks.length;i++){
if(tasks[i]>0){
return true;
}
}
return false;
}
public Integer getTopTaskNotExecute(int[] tasks,List<Integer> executeTasks){
int maxTaskNums=0;
int maxNumsTaskIndex=-1;
for(int i=0;i<tasks.length;i++){
if(!executeTasks.contains(i) && tasks[i]>maxTaskNums){
maxTaskNums=tasks[i];
maxNumsTaskIndex=i;
}
}
if(maxNumsTaskIndex!=-1){
tasks[maxNumsTaskIndex]--;
}
return maxNumsTaskIndex;
}
}
复制代码
固然若是只要解决问题,能够直接计算出结果ui
仍是使用贪心的策略来做为逻辑考虑的spa
public int leastInterval(char[] tasks, int n) {
int[] taskArr=new int[26];
for(char c:tasks){
taskArr[c-'A']++;
}
Arrays.sort(taskArr);
int m=0;
for(int i=25;i>-1;i--){
if(taskArr[i]==taskArr[25]){
m++;
}else{
break;
}
}
return Math.max(tasks.length,(taskArr[25]-1)*(n+1)+m);
}
复制代码
贪心算法思路code