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博客

相关推荐
清酒难咽5 小时前
算法案例之递归
c++·经验分享·算法
让我上个超影吧6 小时前
【力扣26&80】删除有序数组中的重复项
算法·leetcode
张张努力变强7 小时前
C++ Date日期类的设计与实现全解析
java·开发语言·c++·算法
沉默-_-7 小时前
力扣hot100滑动窗口(C++)
数据结构·c++·学习·算法·滑动窗口
钱彬 (Qian Bin)7 小时前
项目实践19—全球证件智能识别系统(优化检索算法:从MobileNet转EfficientNet)
算法·全球证件识别
feifeigo1237 小时前
基于EM算法的混合Copula MATLAB实现
开发语言·算法·matlab
漫随流水7 小时前
leetcode回溯算法(78.子集)
数据结构·算法·leetcode·回溯算法
IT猿手8 小时前
六种智能优化算法(NOA、MA、PSO、GA、ZOA、SWO)求解23个基准测试函数(含参考文献及MATLAB代码)
开发语言·算法·matlab·无人机·无人机路径规划·最新多目标优化算法
We་ct8 小时前
LeetCode 151. 反转字符串中的单词:两种解法深度剖析
前端·算法·leetcode·typescript
芜湖xin8 小时前
【题解-Acwing】AcWing 5579. 增加模数(TLE)
算法·快速幂