输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s,如果有多对数字的和等于s,输出任意一对即可。
1、枚举
固定一个数字,然后依次判断数组中该数字后面的数字与它的和是不是等于s。
时间复杂度:O(n^2)
2、前后遍历
利用排序数组的规律,定义两个指针,分别指向数组的首尾,如果两个指针所指的数字大于s,则尾指针-1;如果小于s,则首指针+1;如果等于s,则输出。如果两个指针相遇,仍找不到等于s的两个数,则说明数组中不存在和为s的两个数字。
http://www.nowcoder.com/books/coding-interviews/390da4f7a00f44bea7c2f3d19491311b?rp=2
输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
AC代码:
class Solution { public: vector<int> FindNumbersWithSum(vector<int> array,int sum) { vector<int> result; int len=array.size(); if(len<=1) return result; bool found=false; int pHead=0,pTail=len-1; int curSum=0,greatestSum=INT_MAX,multiply=1; int num1=0,num2=0; while(pTail>pHead){ curSum=array[pHead]+array[pTail]; if(curSum==sum){ found=true; multiply=array[pHead]*array[pTail]; if(multiply<greatestSum){ greatestSum=multiply; num1=array[pHead]; num2=array[pTail]; } pHead++; pTail--; } else if(curSum>sum) pTail--; else pHead++; } if(found==false) return result; result.push_back(num1); result.push_back(num2); return result; } };转载于:https://www.cnblogs.com/AndyJee/p/4682186.html