leetcode题解167-两数之和 II - 输入有序数组
发布日期:2025-04-05 05:13:57 浏览次数:10 分类:精选文章

本文共 1216 字,大约阅读时间需要 4 分钟。

为了找到已经按照升序排列的数组中两个数,使它们的和等于给定的目标数,并返回这两个数的下标(从1开始且下标i小于j),可以使用双指针法。这种方法能在O(n)时间复杂度内完成任务,高效且方便。

Algorithm Explanation:

  • 初始化双指针: 设置指针i和j,分别指向数组的起点和终点。
  • 循环条件: 直到i小于j为止。
  • 计算和: 每次循环计算i和j所指向的元素的和。
  • 判断和的大小:
    • 如果和等于目标数,记录i和j的值并返回它们的下标(加1)。
    • 如果和小于目标数,向右移动i,使和增大。
    • 如果和大于目标数,向左移动j,使和减小。
  • 返回结果: 可能在循环中找到匹配的数对,直接返回结果。
  • Sample Example:

    给定数组 numbers = [2,7,11,15],目标 target = 9

    • 指针i开始于0,指针j开始于3。
    • 计算2 + 15 = 17 > 9,j移动到2。
    • 计算2 + 11 = 13 > 9,j移动到1。
    • 计算2 + 7 = 9,符合目标,返回下标1和2。

    Code Implementation:

    class Solution {    public int[] twoSum(int[] numbers, int target) {        int i = 0, j = numbers.length - 1;        int[] results = new int[2];                while (i < j) {            int sum = numbers[i] + numbers[j];            if (sum == target) {                results[0] = i;                results[1] = j;                return results;            } else if (sum < target) {                i++;            } else {                j--;            }        }        return results;    }}

    Steps:

  • 双指针初始化: i从数组起点(0),j从终点(数组长度-1)。
  • 循环进行: 检查i是否小于j,如果超过则解出。
  • 计算两数和: 与目标值对比,决定移动i或j。
  • 找到匹配对: 一旦找到符合条件的数对,保存并返回结果。
  • 优点:

    • 高效性: 时间复杂度为O(n),因为每个数字最多被处理一次。
    • 简单易懂: 简单的逻辑,只需两指针移动。
    • 利用排序: 利用数组已排序的特性,使得复杂度最优。

    总结:

    使用双指针法在O(n)时间内解决两数之和问题,特别适用于已排序数组。这一算法简洁高效,易于实现且理解。

    上一篇:leetcode题解172-阶乘后的零
    下一篇:leetcode题解162-寻找峰值

    发表评论

    最新留言

    路过按个爪印,很不错,赞一个!
    [***.219.124.196]2025年04月26日 17时37分16秒