【剑指offer】75.和为S的两个数字

总目录:

算法之旅导航目录

 

1.问题描述

输入一个升序数组 array 和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,返回任意一组即可,如果无法找出这样的数字,返回一个空数组即可。
数据范围: 0≤len(array)≤10^5​​ , 1≤array[i]≤10^6

 

2.问题分析

 1哈希法

目标值-当前值=要查找的值,直接询问哈希表即可。但这种做法没有用上“升序”这个设定。

2对撞指针法

首尾2个指针进行对撞遍历,大于目标值则右指针-1,小于目标值则左指针+1


3.代码实例

哈希法

 1 class Solution {
 2   public:
 3     vector<int> FindNumbersWithSum(vector<int> array, int sum) {
 4         vector<int> res;
 5         //创建哈希表
 6         unordered_set<int> hashSet;
 7         for (int val : array) {
 8             hashSet.insert(val);
 9         }
10 
11         //在哈希表中查找sum-array[i]
12         int temp = 0;
13         for (int i = 0; i < array.size(); i++) {
14             temp = sum - array[i];
15             //哈希查找
16             if (hashSet.count(temp) <= 0) {
17                 continue;
18             }
19 
20             //取出数字添加
21             res.push_back(temp);
22             res.push_back(array[i]);
23             break;
24         }
25         return res;
26     }
27 };

 

对撞指针法

 1 class Solution {
 2 public:
 3     vector<int> FindNumbersWithSum(vector<int> array,int sum) {
 4         vector<int> res;
 5         //左右双指针
 6         int left = 0, right = array.size() - 1;
 7         //对撞双指针
 8         while(left < right){
 9             //相加等于sum,找到目标
10             if(array[left] + array[right] == sum){
11                 res.push_back(array[left]);
12                 res.push_back(array[right]);
13                 break;
14             //和太大,缩小右边
15             }else if(array[left] + array[right] > sum)
16                 right--;
17             //和太小,扩大左边
18             else
19                 left++;
20         }
21         return res;
22     }
23 };

 

posted @ 2022-12-06 20:29  啊原来是这样呀  阅读(59)  评论(0)    收藏  举报