输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的
剑指Offer两数之和为S题解
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的
思路:
//思路:用两个指针,头尾指针向中间靠拢, //当两数之和大于S时,说明最大值太大了(数组是递增的),所以右指针向左移动 //两数之和小于S时,说明太小了,左指针向右移动 //两数之和等于S就是所要求的 //乘积最小使迷惑的,当第一个符合条件就是最小的
#include <iostream> #include <vector> using namespace std; //输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, //如果有多对数字的和等于S,输出两个数的乘积最小的 //思路:用两个指针,头尾指针向中间靠拢, //当两数之和大于S时,说明最大值太大了(数组是递增的),所以右指针向左移动 //两数之和小于S时,说明太小了,左指针向右移动 //两数之和等于S就是所要求的 //乘积最小使迷惑的,当第一个符合条件就是最小的 class Solution { public: vector<int> FindNumbersWithSum(vector<int> array,int sum) { vector<int> result; int left = 0, right = array.size()-1; // 双指针 while(left < right) { if (array[left]+array[right] == sum) { result.push_back(array[left]); result.push_back(array[right]); break; } else if(array[left]+array[right] > sum) // 说明右边的太大, right--; else left++; } return result; } }; int main() { vector<int> nums={1,2,3,4,5,6,7,8}; Solution s; vector<int> vec = s.FindNumbersWithSum(nums,9); cout << vec[0] << " " << vec[1]; return 0; }