LeetCode - LCR 179.查找总价格为目标值的两个商品

一. 题目链接

 LeetCode - LCR 179. 查找总价格为目标值的两个商品

解法(双指针 - 对撞指针):

算法思路:

注意到本题是升序的数组,因此可以用「对撞指针」优化时间复杂度。

算法流程:

初始化left ,right 分别指向数组的左右两端(这里不是我们理解的指针,而是数组的下标),当left < right 的时候,⼀直循环

i. 当nums[left] + nums[right] == target 时:

  • 说明找到结果,记录结果,并且返回;

ii. 当nums[left] + nums[right] < target 时:

  • 对于nums[left]而言,此时nums[right] 相当是nums[left] 能碰到的最大值(别忘了,这是升序数组)。如果此时不符合要求,说明在这个数组里⾯, 没有别的数符合nums[left] 的要求了(最大的数都满足不了你,你已经没救了)。 因此,我们可以大胆舍去这个数,让left++ ,去比较下⼀组数据;
  • 那对于nums[right]而言,由于此时两数之和是小于目标值的, nums[right] 还可以选择比nums[left]大的值继续努力达到目标值,因此right 指针我们按兵不动;

iii. 当nums[left] + nums[right] > target 时:

  • 同理我们可以舍去,nums[right](最小的数都满足不了你,你也没救了)。让right-- ,继续比较下⼀组数据,而left 指针不变(因为他还是可以去匹配比nums[right] 更小的数的)。

二. 动画解释 

三. 代码解释 

class Solution {
public:
    vector<int> twoSum(vector<int>& price, int target) 
    {
        int left = 0;
        int right = price.size()-1;
        while(left < right)
        {
            int sum = price[left] + price[right];
            if(sum > target)
            {
                right--;
            }
            else if(sum < target)
            {
                left++;
            }

            else
            {
                return {price[left],price[right]};
            }
        }
        return {-1,-1};
    }
};

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-25 20:18:08       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-25 20:18:08       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-25 20:18:08       82 阅读
  4. Python语言-面向对象

    2024-04-25 20:18:08       91 阅读

热门阅读

  1. alert() 函数功能

    2024-04-25 20:18:08       29 阅读
  2. EureKa详解

    2024-04-25 20:18:08       31 阅读
  3. 6-137 高精度小数

    2024-04-25 20:18:08       37 阅读
  4. Http长连接 和 短连接 原理

    2024-04-25 20:18:08       31 阅读
  5. lodash库(防抖、节流)

    2024-04-25 20:18:08       35 阅读
  6. 小红书如何打造爆款内容?

    2024-04-25 20:18:08       33 阅读