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

相关推荐
leobertlan4 小时前
痛苦系列 | DSP-03 跨越单位圆:Z变换与零极点分析
算法·程序员
蛋蛋的就会顺顺的5 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
开发小能手1235 小时前
答案daanC语言
数据结构·算法
Navigator_Z7 小时前
LeetCode //C - 1291. Sequential Digits
c语言·算法·leetcode
pride.li8 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
旺仔仔仔9 小时前
机器人项目实战(5):从单次抓取,到接收指令连续做事
算法
旺仔仔仔9 小时前
机器人项目实战(2):识别物体、提取点云,再到抓取姿态
算法
姜鱼问生9 小时前
密码明明一样,为什么 GPG 说“错的“?
后端·算法·架构
启观川9 小时前
数据结构与算法-第 3 章 常用算法-贪心算法
数据结构·笔记·python·算法·贪心算法
对空六课9 小时前
指标口径生效时间的版本查询实现
大数据·服务器·前端·算法·数据分析