LeetCode LCR 179. 和为s的两个数字

原题链接:LCR 179. 查找总价格为目标值的两个商品 - 力扣(LeetCode)
题目的意思:通过给定的数组,找出两个值,相加并等于目标值。
第一种思路,暴力枚举,伪代码如下:

cpp 复制代码
for (int i = 0; i < n; ++i)
{
	for (int j = i + 1; j < n; ++j)
	{
		if (nums[i] + nums[j] == target) break;
	}
}

可以看出,时间复杂度为 O(N^2),
第二种思路: 采用双指针 + 单调性解决问题。

同时,题目有一个条件,其数据是按照升序排序的。
假设数据为 [8, 21, 27, 34, 52, 66],目标值为61;

我们先固定两个值,让这两个值相加,这两个值相加的结果无非就三种:

  1. left + right > target;
  2. left + right < target;
  3. left + right = target;

如果是第一种情况,因为数据是有序的,且left是当前范围 [left, right] 最小的数据,最小的数据 + right (66) 都大于了目标值 (61),因此,66 这个值就可以排除了,即 right 向左移动;

如果是第二种情况,因为此时 right 是当前范围 [left, right] 中最大的数据,最大的数据 + left 都小于目标值,因此,left 当前位置的数据就可以排除了,故 left 向右移动;

如果是第三种情况,那么说明找到了目标的两个值,返回即可。
代码如下:

cpp 复制代码
class Solution {
public:
    inline int Compare(int x, int y, int target)
    {
        return x + y - target;
    }

    vector<int> twoSum(vector<int>& price, int target) {
        int left = 0;
        int right = price.size() - 1;

        while(left < right)
        {
            int ret = Compare(price[left],price[right],target);
            if(ret > 0) right--;
            else if(ret < 0) left++;
            else break;
        }
        return {price[left], price[right]};
    }
};

此时的时间复杂度就是 O(N),因为left 向右移动,right 向左移动,最坏情况也就是遍历一遍数组。
以此为基础,我们接下来讨论三数之和。 LeetCode 15. 三数之和-CSDN博客

相关推荐
Wang20122013几秒前
AI 相关的算法;架构等专有名称总结和介绍
人工智能·算法·架构
良木生香7 分钟前
【数据结构-初阶】二叉树(1)---树的相关概念
c语言·数据结构·算法·蓝桥杯
良木生香7 分钟前
【数据结构-初阶】二叉树(2)---堆
c语言·数据结构·算法·蓝桥杯
KingRumn6 小时前
Linux信号之标准信号与实时信号
linux·算法
源代码•宸9 小时前
Leetcode—620. 有趣的电影&&Q3. 有趣的电影【简单】
数据库·后端·mysql·算法·leetcode·职场和发展
2301_8002561110 小时前
地理空间数据库中的CPU 和 I/O 开销
数据库·算法·oracle
一个不知名程序员www10 小时前
算法学习入门---结构体和类(C++)
c++·算法
XFF不秃头13 小时前
力扣刷题笔记-旋转图像
c++·笔记·算法·leetcode
王老师青少年编程13 小时前
csp信奥赛C++标准模板库STL案例应用3
c++·算法·stl·csp·信奥赛·lower_bound·标准模版库