LeetCode Everyday - 采购方案

74 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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^5
  • 1 <= 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)
};

最后

如果有更好的解法或者思路, 欢迎在评论区和我交流~ ღ( ´・ᴗ・` )