[LCP28] 采购方案

LCP 28 采购方案

1.题目

小力将 N 个零件的报价存于数组 nums。小力预算为 target,假定小力仅购买两个零件,要求购买零件的花费不超过预算,请问他有多少种采购方案。

注意:答案需要以 1e9 + 7 (1000000007) 为底取模,如:计算初始结果为:1000000008,请返回 1

2.解题思路

从题目给的注意和数据量来看,暴力循环一定是不行的。因此代替暴力循环最常见的方法就是双指针。

首先分析题目:输入是数组和预算目标值。输出的是数组中任意选取两个数相加可以小于目标值的所有方案。因此很容易想到需要对数组做一次排序。

step1. 数组升序排序(qsort)

step2. 设置左指针在有序数组左端,右指针在有序数组右端

step3. 以左指针为外循环基准,左移右指针。当左指针 + 右指针的值恰好小于目标值时,从左指针到右指针之间的所有数据则都满足要求,则统计完当前左指针下,满足条件的方案。

step4. 然后右移一次左指针,右指针在当前位置下积蓄左移,重复step3统计累计所有方案(这时,右指针不需要从最右端重新再刷新了,因为左指针向右移动后,一定满足 nums[left] + nums[right] <= nums[left + 1] + nums[right])

step5. 结束条件:当左指针和右指针相遇以后,左右指针之间的数据量为负数,则不符合常理,退出循环。

3.数据结构与算法

算法:排序算法+双指针

4.排序算法 + 双指针

int sort_up(const void *a, const void *b) {
    return *(int *)a - *(int *)b;
}
int purchasePlans(int* nums, int numsSize, int target){

    qsort(nums, numsSize, sizeof(nums[0]), sort_up);

    int left = 0;
    int right = numsSize - 1;
    long long sum = 0;
    
    while (left < right) {
        if (nums[right] + nums[left] > target)
            right--;
        else {
            sum += (long long)(right - left);
            left++;c
        }

    }
    sum = (int) (sum % (1000000007));
    return sum;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值