JZⅡ006. 排序数组中两个数字之和

这篇博客介绍了一个寻找有序数组中两数之和等于目标值的高效算法。通过设置双指针,左右两端分别指向数组首尾,根据两数之和与目标值的大小关系调整指针位置,实现O(N)的时间复杂度。这种方法充分利用了数组的有序性,避免了暴力求解的高时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

  给定一个已按照升序排序的整数数组numbers,请你从数组中找出两个数满足相加之和等于目标数target

  函数应该以长度为2的整数数组的形式返回这两个数的下标值。numbers的下标从0开始计数。

  假设数组中存在且只存在一对符合条件的数字,同时一个数字不能使用两次。


示例:
  输入:numbers = [1, 2, 4, 6, 10], target = 8
  输出:[1, 3]


思路:
  对于该题来说,比较容易想到的思路就是,先遍历一次数组,依次用数组中的每一个数作为第一个数,然后再遍历一次数组,尝试用数组中剩余的数作为第二个数,如果符合要求则将这两个数的下标进行返回即可。这种方式虽然最终能得到正确答案,但是该方法的时间复杂度是 O ( N 2 ) O(N^2) O(N2)

  在解决该题时我们应该充分利用数组有序的特性,用两个变量left和right先分别索引数组的第一个数和最后一个数,然后循环进行以下操作:

  1. 将left和right位置的数据相加得到sum。
  2. 如果sum大于target,则让right–,使得sum变小。
  3. 如果sum小于target,则让left++,使得sum变大。
  4. 如果sum和target相等,则将其保持返回。

最终我们就能够得到两个目标数的下标,而该方法的时间复杂度是 O ( N ) O(N) O(N)


代码如下:

class Solution {
public:
	vector<int> twoSum(vector<int>& numbers, int target) {
		size_t left = 0;
		size_t right = numbers.size() - 1;
		vector<int> ret;
		while (left < right)
		{
			//将left和right位置的数据相加
			int sum = numbers[left] + numbers[right];
			//1、如果sum小于target,则让left++,使得sum变大
			if (sum < target)
			{
				left++;
			}
			//2、如果sum大于target,则让right--,使得sum变小
			else if (sum > target)
			{
				right--;
			}
			//3、如果sum和target相等,则将其保持返回
			else
			{
				ret.push_back(left);
				ret.push_back(right);
				break;
			}
		}
		return ret;
	}
};
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

2021dragon

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

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

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

打赏作者

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

抵扣说明:

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

余额充值