携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第27天,点击查看活动详情 >>
采购方案
小力将 N 个零件的报价存于数组 nums。小力预算为 target,假定小力仅购买两个零件,要求购买零件的花费不超过预算,请问他有多少种采购方案。
注意:答案需要以 1e9 + 7 (1000000007) 为底取模,如:计算初始结果为:1000000008,请返回 1
示例1:
输入:`nums = [2,5,3,5], target = 6`
输出:`1`
解释:预算内仅能购买 nums[0] 与 nums[2]。
示例2:
输入:nums = [2,2,1,9], target = 10
输出:4
解释:符合预算的采购方案如下:
nums[0] + nums[1] = 4
nums[0] + nums[2] = 3
nums[1] + nums[2] = 3
nums[2] + nums[3] = 10
提示:
2 <= nums.length <= 10^51 <= nums[i], target <= 10^5
解题思路:
1. 先排个序,设定一个maxIndex,初始值等于length;
2. 然后开始首尾相加,因为排过序,那么首位肯定是最小的,如果最小的首位加上末尾都大于target了,那么后面的都不用算了,肯定大于target; 如果加上末尾都符合条件,那么中间都比末尾小,肯定是符合条件的。
我的答案:
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var purchasePlans = function (nums, target) {
// 先将nums升序排序
nums.sort((a,b) => a - b)
// 声明两个指针和采购方案总数
let left = 0, right = nums.length - 1, ret = 0
// 循环判断首尾相加的和,因为排过序,那么首位肯定是最小的,如果最小的首位加上末尾都大于target了,那么后面的都不用算了,肯定大于target; 如果加上末尾都符合条件,那么中间都比末尾小,肯定是符合条件的。
while (left < right) {
if (nums[left] + nums[right] > target) right--
else {
ret += right - left
left++
}
}
return ret % (10**9 + 7)
};
最后
如果有更好的解法或者思路, 欢迎在评论区和我交流~ ღ( ´・ᴗ・` )