力扣经典150题第二十七题:两数之和 II - 输入有序数组

简介: 力扣经典150题第二十七题:两数之和 II - 输入有序数组

力扣经典150题解析之二十七:两数之和 II - 输入有序数组

1. 介绍

在这篇文章中,我们将解析力扣经典150题中的第二十六题:两数之和 II - 输入有序数组。题目要求在一个已按非递减顺序排列的整数数组中,找出两个数的和等于目标数 target,并返回它们的下标。

2. 问题描述

给定一个下标从1开始的整数数组 numbers,该数组已按非递减顺序排列,请你从数组中找出满足相加之和等于目标数 target 的两个数。返回这两个整数的下标,其中 1 <= index1 < index2 <= numbers.length。

3. 示例

示例 1:

输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 + 7 = 9,因此 index1 = 1, index2 = 2。返回 [1, 2]。

示例 2:

输入:numbers = [2,3,4], target = 6
输出:[1,3]
解释:2 + 4 = 6,因此 index1 = 1, index2 = 3。返回 [1, 3]。

示例 3:

输入:numbers = [-1,0], target = -1
输出:[1,2]
解释:-1 + 0 = -1,因此 index1 = 1, index2 = 2。返回 [1, 2]。

4. 解题思路

由于数组已经按非递减顺序排列,我们可以利用双指针技巧来解决这个问题:

  1. 使用两个指针 left 和 right 分别指向数组的头部和尾部。
  2. 如果指针 left 和 right 所指向的元素之和等于 target,则返回它们的下标。
  3. 如果指针 left 和 right 所指向的元素之和小于 target,则将 left 右移一位。
  4. 如果指针 left 和 right 所指向的元素之和大于 target,则将 right 左移一位。

5. 算法实现

public int[] twoSum(int[] numbers, int target) {
    int left = 0, right = numbers.length - 1;
    while (left < right) {
        int sum = numbers[left] + numbers[right];
        if (sum == target) {
            return new int[] {left + 1, right + 1}; // 返回下标,注意下标从1开始
        } else if (sum < target) {
            left++;
        } else {
            right--;
        }
    }
    return new int[] {-1, -1}; // 未找到满足条件的情况
}

6. 复杂度分析

  • 时间复杂度:O(n),其中 n 是数组 numbers 的长度。双指针遍历一次数组。
  • 空间复杂度:O(1),只使用了常数级的额外空间。

7. 测试与验证

测试用例设计
  • 输入数组长度为2,包含两个元素满足条件。
  • 输入数组长度为3,包含三个元素满足条件。
  • 输入数组长度为4,找不到满足条件的两个元素。
测试结果分析

根据不同的测试用例,分析算法的输出结果,验证解决方案的正确性和有效性。

8. 总结

通过双指针法,我们可以高效地在有序数组中找出两个数的和等于目标数 target,并返回它们的下标。本文详细介绍了解题思路、算法实现和复杂度分析,希望对读者理解该问题和解决方法有所帮助。

9. 参考文献

  • LeetCode 官方网站
  • 《算法导论》
  • 《程序员面试金典》

感谢阅读

期待下一篇…

相关文章
|
5月前
|
索引 容器
两数之和(每天刷力扣hot100系列)
本题要求在数组中找出两数之和等于目标值的下标。解法一为暴力枚举,时间复杂度O(N²),空间复杂度O(1);解法二利用哈希表,将查找时间降为O(1),总时间复杂度O(N),空间复杂度O(N),实现以空间换时间的优化。
leetCode(删除有序数组中的重复项)
如何在不使用额外空间的情况下,通过双指针法原地删除有序数组中的重复项。
146 2
|
存储 Java API
LeetCode------合并两个有序数组(4)【数组】
这篇文章介绍了LeetCode上的"合并两个有序数组"问题,并提供了三种解法:第一种是使用Java的Arrays.sort()方法直接对合并后的数组进行排序;第二种是使用辅助数组和双指针技术进行合并;第三种则是从后向前的双指针方法,避免了使用额外的辅助数组。
LeetCode------合并两个有序数组(4)【数组】
|
11月前
|
Go 索引 Perl
【LeetCode 热题100】【二叉树构造题精讲:前序 + 中序建树 & 有序数组构造 BST】(详细解析)(Go语言版)
本文详细解析了二叉树构造的两类经典问题:通过前序与中序遍历重建二叉树(LeetCode 105),以及将有序数组转化为平衡二叉搜索树(BST,LeetCode 108)。文章从核心思路、递归解法到实现细节逐一拆解,强调通过索引控制子树范围以优化性能,并对比两题的不同构造逻辑。最后总结通用构造套路,提供进阶思考方向,帮助彻底掌握二叉树构造类题目。
743 9
LeetCode第26题删除有序数组中的重复项
这篇文章介绍了LeetCode第26题"删除有序数组中的重复项"的解题方法,通过使用双指针技巧,高效地去除数组中的相邻重复元素。
LeetCode第26题删除有序数组中的重复项
LeetCode第80题删除有序数组中的重复项 II
文章介绍了LeetCode第80题"删除有序数组中的重复项 II"的解法,利用双指针技术在O(1)空间复杂度内原地删除重复元素,并总结了双指针技术在处理有序数组问题中的应用。
LeetCode第80题删除有序数组中的重复项 II
|
C++
Leetcode第一题(两数之和)
这篇文章介绍了解决LeetCode第一题“两数之和”的两种方法:暴力法和哈希表法,并提供了相应的C++代码实现。
381 0
Leetcode第一题(两数之和)
LeetCode第88题合并两个有序数组
文章分享了LeetCode第88题"合并两个有序数组"的解法,通过从后向前的合并策略避免了数组元素的前移,使用三个指针高效地完成了合并过程。
|
存储 索引
LeetCode------两数之和(3)【数组】
这篇文章介绍了LeetCode上的"两数之和"问题,提供了两种解法:一种是暴力求解法,通过双层循环遍历数组元素对查找两数之和为目标值的索引,时间复杂度为O(n^2);另一种是使用HashMap优化,通过存储元素值和索引,时间复杂度降低到O(n)。
LeetCode------两数之和(3)【数组】
【LeetCode 48】108.将有序数组转换为二叉搜索树
【LeetCode 48】108.将有序数组转换为二叉搜索树
163 0