查找总价格为目标值的两个商品

目录

一:题目链接

二:题目思路

三:代码实现


一:题目链接

        题目要求找到数组的两个数字,加起来能够等于目标数字的值,再返回当前的两个数字结果。没有合适的两个数字就返回空数组。

二:题目思路

        这里不使用暴力枚举解决,因为数字是按照升序记录的,所以,我们可以利用数组的单调性来解决问题,类似与我们前面所讲的 “题目链接”。

        首先,定义两个指针,一个指向数组起始位置(left),另一个指向数组后一个元素的位置(right),再判断这两个位置的元素相加结果,会有三种情况。

        第一种情况,这两个元素相加结果比目标值小,也就是当前数组区间最小的元素加上最大的元素结果比目标值小;或者说,由于数组是单调递增的,如果 left 不动,right 不断往前走再与 left 相加判断,结果一定是比目标值更小,所以,当前的 left 就可以舍弃了,直接 left++ 进入下一个新的判断区间。 

        第二种情况,这两个元素相加结果比目标值大,也就是当前数组区间最小的元素加上最大的元素结果比目标值大;或者说,由于数组是单调递增的,如果 right 不动,left 不断往后走再与 right 相加判断,结果一定是比目标值更大,所以,当前的 right 就可以舍弃了,直接 right-- 进入下一个新的判断区间。 

        第三种情况,这两个元素相加结果等于目标值。就可以直接返回当前的两个下标元素值了。

三:代码实现

        int left = 0;
        int right = price.length - 1;

        while(left < right) {
            if(price[left] + price[right] < target) {
                left++;
            }else if(price[left] + price[right] > target) {
                right--;
            }else {
                return new int[] {price[left] , price[right]};
            }
        }

        //未找到合适的两个数字,返回空数组
        return new int[] {0};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值