和为s的两个数字
关键词:双指针(对撞指针)
题目描述
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
示例 1:
1 |
|
示例 2:
1 |
|
解法
解法一:
思路:
- 利用 HashMap 可以通过遍历数组找到数字组合,时间和空间复杂度均为 O(N);
- 注意本题的 nums 是 排序数组 ,因此可使用 双指针法 将空间复杂度降低至 O(1) 。
算法流程:
初始化: 双指针 i , j 分别指向数组 nums的左右两端 (俗称对撞双指针)。
循环搜索: 当双指针相遇时跳出;
计算和 s=nums[i]+nums[j];
若 s>target ,则指针 j 向左移动,即执行 j=j−1 ;
若 s<target,则指针 i 向右移动,即执行 i=i+1 ;
若 s=target ,立即返回数组 [nums[i],nums[j]];返回空数组,代表无和为 target的数字组合。
代码:
1 |
|
知识点
- 双指针(对撞指针)。