洗咖啡
public static int process(int[] drinks,int a,int b,int index,int washline){
if(index == drinks.length -1){
return Math.min(Math.max(washline,drinks[index])+a,drinks[index]+b);
}
int wash = Math.max(washline,drinks[index])+a;
int next1 = process(drinks,a,b,index+1,wash);
int p1 = Math.max(wash,next1);
int dry = drinks[index]+b;
int next2 = process(drinks,a,b,index,washline);
int p2 = Math.max(dry,next2);
return Math.min(p1,p2);
}
给定一个数组arr长度为N,从中间一分为二,求两边最大值相减然后取绝对值,最大的返回。 思路。首先找到该数组的最大值,如果该最大值划分为左边,右边肯定取到最后一个位置,我们想要右边取得较小的最大值,我们肯定取最右边的值,最右边的一定能取到,为什么一定取最右边的值呢,因为,不管右边取什么,较小的最大值一定是最右边的,可以用反证法证明下,同理,如果最大值划分到右边,左边也是如此,所以结果就是 数组中最大值,减去 最左边的 ,或者 最大值减去最右边的,然后比较两边取绝对值之后较大的返回。
给定一个Job类型的数组jobarr,表示所有的工作。给定一个int类型的数组arr,表示所有小伙伴的能力,返回一个int类型数组,表示每一个小伙伴所获得的报酬
public class Job {
public int money;
public int hard;
public Job(int money,int hard){
this.money = money;
this.hard = hard;
}
public static class JobComparator implements Comparator<Job>{
public int compare(Job o1,Job o2){
return o1.hard!=o2.hard?(o1.hard-o2.hard):(o2.money-o1.money);
}
}
public static int[] geteMoneys(Job[] job,int[] ability){
Arrays.sort(job,new JobComparator());
TreeMap<Integer,Integer> map = new TreeMap<>();
map.put(job[0].hard,job[0].money);
Job pre = job[0];
for(int i = 1;i < job.length;i++){
if(job[i].hard != pre.hard && job[i].money > pre.money){
pre = job[i];
map.put(pre.hard,pre.money);
}
}
int[] ans = new int[ability.length];
for(int i = 0; i < ability.length;i++){
Integer key = map.floorKey(ability[i]);
ans[i] = key != null ? map.get(key):0;
}
return ans;
}
}
给定一个字符串,如果符合人们日常书写的一个整数格式,返回int类型的这个数,如果不符合或者越界返回-1或者报错。
|