【剑指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 };
 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号