题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:
对应每个测试案例,输出两个数,小的先输出。
自己的思路:有点麻烦,
class Solution { public: vector<int> FindNumbersWithSum(vector<int> array,int sum) { vector<int> result; int low = 0; int len = array.size()-1; int high = len; if(!array.size()||sum<array[low]) return result; bool flag = false; //low指针从头到尾 while(low<len){ while(low<high){ flag = false; //当当前两个数小于S时,退出 if(array[low]+array[high]<sum){ flag = true; break; } if(array[low]+array[high]==sum){ result.push_back(array[low]); result.push_back(array[high]); return result; } high--; } low++; if(!flag) high=len-low+1; } return result; } };
评论区思路:
双指针法:
import java.util.ArrayList; public class Solution { public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) { ArrayList<Integer> result = new ArrayList<>(); if(array.length == 0||array[0]>=sum) return result; int low= 0; int high = array.length - 1; while(low<high){ if(array[low]+array[high]==sum) { result.add(array[low]); result.add(array[high]); return result; }else if(array[low]+array[high]<sum){ low++; }else{ high--; } } return result; } }
哈希法:
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { map<int,int> mp; vector<int> res; for(int num:nums){ if(mp[target - num]!=0){ res.emplace_back(num); res.emplace_back(target-num); return res; }else{ mp[num] = 1; } } return res; } };