(6)双指针练习:查找总价格为目标值的两个商品

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

题目链接:LCR 179. 查找总价格为目标值的两个商品 - 力扣(LeetCode)

购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况,返回任一结果即可。

思路解析:

本题直观解法是暴力枚举,使用两层for循环计算所有和与target进行比较,相等时返回两个加数即可,但是这种方法会超时,所以考虑其他方法。

因为本题题干已经说明数组是升序,所以数组满足单调性,考虑使用双指针算法,两数加和与另外一个数值比较只会有下面的三种情况:

  1. sum < target
  2. sum > target
  3. sum == target

数组有序后,定义一个left指针从左向右遍历,一个right指针从右向左遍历,第一种情况如果left位置的值+right位置的值小于target,说明此时left过小,因为left后面的数值比当前left的数值大,所以可能存在left+right == target;第二种情况,如果left位置的值+right位置的值小于target,说明此时right过大,因为right前面的数值比当前right的数值小,所以可能存在left+right == target;当找到left + right == target时,直接返回即可

参考代码:

/*
 * @lc app=leetcode.cn lang=c
 *
 * LCR 179 查找总价值为目标值的两个商品
 */

// @lc code=start
// 双指针
class Solution
{
public:
    vector<int> twoSum(vector<int> &price, int target)
    {
        int left = 0;
        int right = price.size() - 1;
        vector<int> ret;
        while (left <= right)
        {
            if (price[left] + price[right] > target)
            {
                right--;
            }
            else if (price[left] + price[right] < target)
            {
                left++;
            }
            else
            {
                ret.push_back(price[left]);
                ret.push_back(price[right]);
                break;
            }
        }

        return ret;
    }
};
// @lc code=end

也可以写成:

/*
 * @lc app=leetcode.cn lang=c
 *
 * LCR 179 查找总价值为目标值的两个商品
 */

// @lc code=start
class Solution
{
public:
    vector<int> twoSum(vector<int> &price, int target)
    {
        int left = 0, right = price.size() - 1;
        while (left < right)
        {
            int sum = price[left] + price[right];
            if (sum < target)
                left++; // 第一种情况
            else if (sum > target)
                right--; // 第二种情况
            else
                return {price[left], price[right]}; // 第三种情况
        }
        // 函数必须要有返回值
        return {};
    }
};
// @lc code=end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怡晗★

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值