返回

算法入门:用 C++ 轻松掌握 LeetCode #167 两数之和 II(输入有序数组)

IOS

踏入算法编程的殿堂,LeetCode 是绕不开的一座丰碑。今天,让我们将目光聚焦在 LeetCode 上的一道经典题目:#167 两数之和 II(输入有序数组)。通过 C++ 的简洁语法,我们将共同探索这道题目的巧妙解法,为你的算法之旅奠定坚实的基础。

问题

给你一个包含 n 个整数的升序数组 numbers 和一个目标值 target,请找出两个整数,使得它们的和正好为目标值 target。假设该对数字在数组中出现且只出现一次。

解题思路

由于给定的数组是有序的,我们可以利用二分查找算法的高效特性来解决这个问题。具体步骤如下:

  1. 初始化两个指针 :left 指向数组的第一个元素,right 指向数组的最后一个元素。
  2. 计算目标和 :left 和 right 指向的元素之和。
  3. 比较目标和与 target
    • 如果目标和等于 target,则返回 left 和 right 对应的下标。
    • 如果目标和小于 target,则将 left 指向下一个元素(left++)。
    • 如果目标和大于 target,则将 right 指向前一个元素(right--)。
  4. 重复步骤 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(输入有序数组)的问题。这种方法清晰简洁,适合初学者理解和应用。希望这篇教程能够帮助你掌握这道经典算法题,为你的算法学习之旅添砖加瓦。