LeetCode 167. 两数之和 II - 输入有序数组

 

思路#

方法一:二分查找#

在数组中找到两个数,使得它们的和等于目标值,可以首先固定第一个数,然后寻找第二个数,第二个数等于目标值减去第一个数的差。利用数组的有序性质,可以通过二分查找的方法寻找第二个数。为了避免重复寻找,在寻找第二个数时,只在第一个数的右侧寻找。

复制代码
 1 class Solution {
 2 public:
 3     vector<int> twoSum(vector<int>& numbers, int target) {
 4         for(int i = 0; i < numbers.size(); ++i) {
 5             int x = target - numbers[i];
 6             //二分查找x
 7             int left = i+1, right = numbers.size()-1;
 8             while(left <= right) {
 9                 int mid = (left + right)/2;
10                 if(numbers[mid] < x) {
11                     left = mid + 1;
12                 } else if(numbers[mid] > x) {
13                     right = mid - 1;
14                 } else {
15                     return vector<int>({i+1, mid+1});
16                 }
17             }
18         }
19 
20         return vector<int>();
21     }
22 };
复制代码

 

方法二:首尾双指针#

初始时两个指针分别指向第一个元素位置和最后一个元素的位置。每次计算两个指针指向的两个元素之和,并和目标值比较。如果两个元素之和等于目标值,则发现了唯一解。如果两个元素之和小于目标值,则将左侧指针右移一位。如果两个元素之和大于目标值,则将右侧指针左移一位。移动指针之后,重复上述操作,直到找到答案。

复制代码
 1 class Solution {
 2 public:
 3     vector<int> twoSum(vector<int>& numbers, int target) {
 4         int i = 0, j = numbers.size() - 1;
 5         while(i < j) {  //题目有解,i不可能越过j
 6             if(numbers[i] + numbers[j] < target) {
 7                 ++i;
 8             } else if(numbers[i] + numbers[j] > target) {
 9                 --j;
10             } else {
11                 return vector<int>({i+1, j+1});
12             }
13         }
14 
15         return vector<int>();
16     }
17 };
复制代码

 

posted @   拾月凄辰  阅读(89)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
历史上的今天:
2019-03-01 C++中全排列算法函数next_permutation的使用方法
点击右上角即可分享
微信分享提示
主题色彩