LCP 28. 采购方案
也用了双指针,但没有题解那么容易理解。并且本来想在没有遍历到头那里耍个花招,用累加公式,结果越界了,只能再遍历一遍。
public class Solution {
public int PurchasePlans(int[] nums, int target) {
Array.Sort(nums);
// 从大到小看每个稍贵零件可以搭配的稍便宜的零件中最贵的是哪个
int smallPtr = 0;
int bigPtr = nums.Length - 1;
// 方案数
int res = 0;
while(bigPtr >= 1 && smallPtr < bigPtr){
if(nums[bigPtr] + nums[smallPtr] <= target){
// 如果小于预算,则继续增加便宜零件的下标
smallPtr++;
}else{
// 找到临界的便宜零件,此时该零件下标即为可搭配稍便宜零件数
res = (res + smallPtr) % 1000000007;
bigPtr -= 1;
}
}
// 如果没遍历到头,说明从某处开始,所有稍贵的零件都可以搭配所有比它便宜的零件
if(bigPtr != 0){
for(int i = bigPtr; bigPtr > 0; bigPtr--){
res = (res + bigPtr) % 1000000007;
}
}
return res;
}
}
(如有问题感谢指出)