返回
算法入门:用 C++ 轻松掌握 LeetCode #167 两数之和 II(输入有序数组)
IOS
2024-02-15 15:28:54
踏入算法编程的殿堂,LeetCode 是绕不开的一座丰碑。今天,让我们将目光聚焦在 LeetCode 上的一道经典题目:#167 两数之和 II(输入有序数组)。通过 C++ 的简洁语法,我们将共同探索这道题目的巧妙解法,为你的算法之旅奠定坚实的基础。
问题
给你一个包含 n 个整数的升序数组 numbers 和一个目标值 target,请找出两个整数,使得它们的和正好为目标值 target。假设该对数字在数组中出现且只出现一次。
解题思路
由于给定的数组是有序的,我们可以利用二分查找算法的高效特性来解决这个问题。具体步骤如下:
- 初始化两个指针 :left 指向数组的第一个元素,right 指向数组的最后一个元素。
- 计算目标和 :left 和 right 指向的元素之和。
- 比较目标和与 target :
- 如果目标和等于 target,则返回 left 和 right 对应的下标。
- 如果目标和小于 target,则将 left 指向下一个元素(left++)。
- 如果目标和大于 target,则将 right 指向前一个元素(right--)。
- 重复步骤 2 和 3 ,直到找到目标和等于 target 或者 left 大于或等于 right。
代码实现
vector<int> twoSum(vector<int>& numbers, int target) {
int left = 0, right = numbers.size() - 1;
while (left < right) {
int sum = numbers[left] + numbers[right];
if (sum == target) {
return {left + 1, right + 1};
} else if (sum < target) {
left++;
} else {
right--;
}
}
return {};
}
时间复杂度
由于我们使用二分查找算法,因此时间复杂度为 O(log n),其中 n 是数组的长度。
示例
输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
输入:numbers = [12,13,23,28,43], target = 18
输出:[2,4]
总结
利用 C++ 的二分查找算法,我们高效地解决了 LeetCode #167 两数之和 II(输入有序数组)的问题。这种方法清晰简洁,适合初学者理解和应用。希望这篇教程能够帮助你掌握这道经典算法题,为你的算法学习之旅添砖加瓦。