LeetCode: LCP 18. 早餐组合
将两个数组从小到大排序
然后一个数组从小到大遍历,一个数组从大到小遍历( j--
)。
当两个数组合符号条件时,那么从大到小的一方,j 到 0 之间的数都是符合条件的。( j - 0 + 1 )
提交代码
public int breakfastNumber(int[] staple, int[] drinks, int x) {
// 排序了
Arrays.sort(staple);
Arrays.sort(drinks);
int lens = staple.length;
int lend = drinks.length - 1;
long ans = 0L;
long count = 1000000007;
for (int j = lend, i = 0; j >= 0 && i < lens; j--) {
if (staple[i] + drinks[j] <= x) {
ans = (ans + j + 1) % count;
i++;
j++;
}
}
return (int) ans;
}
public static void main(String[] args) {
int[] s = {
2,1,1};
int[] d = {
8,9,5,1};
int x = 9;
Lcp18 l = new Lcp18();
int i = l.breakfastNumber(s, d, x);
System.out.println(i);
}
暴力必然超时…
public int breakfastNumber(int[] staple, int[] drinks, int x) {
// 排序了
Arrays.sort(staple);
Arrays.sort(drinks);
int lens = staple.length;
int lend = drinks.length;
long[] ans = new long[10];
long count = 1000000007;
int index = 0;
for (int i = 0; i < lens; i++) {
for (int j = 0; j < lend; j++) {
if(x >= staple[i] + drinks[j]){
ans[index]++;
if(ans[index] + 1 > Long.MAX_VALUE ){
ans[index] %= count;
index++;
}
}
}
}
for (int i = index; i >= 1; i--) {
ans[0] += ans[i];
}
return (int)ans[0];
}