涉及思想:窗口不回退模型、打表和预处理
题目1:给定一个有序数组arr,代表数轴上从左到右有n个点arr[0],arr[1],...,arr[n-1],给定一个正数L,代表一根长度为L的绳子,求绳子最多能覆盖其中的几个点。
策略:1)找到大于某数最左的位置 复杂度o(NlogN)
2)滑动窗口 o(N)
public static int process(int[] wus, int[] mons, int i, int wu){
if(i == wus.length){
return 0;
}
if(wus[i] > wu){
return mons[i] + process(wus, mons, i + 1, wu + wus[i]);
}
return Math.min(process(wus, mons, i + 1, wu),
mons[i] + process(wus, mons, i + 1, wu + wus[i]));
}
题目二:小虎买苹果,只有6袋和8袋,返回最小使用的袋子,不能装下,返回-1
普通方法:假设100个苹果,先看最多能用几个8袋,100/8 = 12个,还剩4个,不能用6袋搞定,失败;11个8袋,还剩12个,2个6袋,成功
进阶:假设107个苹果,107/8=13个,还剩3个,失败,12个8袋,剩11个.