题目:
题目描述:
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:
对应每个测试案例,输出两个数,小的先输出。
方法一:
两层循环,定义一个头一个尾,外层循环从头到尾,表示第一个元素,内层循环在外层循环内,表示第二个元素,判断两数之和是否为S,找到一组元素,退出循环。
分析:假设第一个元素为a,第二个元素为b,a+b=sum,a<=b,则a<=sum/2,所以找到的第一组元素,即a最小的那一组为乘积最小的。
如果要求出所有的组,每找到一个点,将头改为第一个元素的下表,尾改为第二个元素的下表,继续循环
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum)
{
int begin=0;
int end=array.size();
vector<int>result;
for(int i=begin;i<end;i++)
{
if(!result.empty())
break;
for(int j=i;j<end;j++)
{
if(array[i]+array[j]==sum)
{
// begin=i+1; //求所有的组时使用,重置头尾节点
// end=j;
result.push_back(array[i]);
result.push_back(array[j]);
break;
}
}
}
return result;
}
};
时间复杂度:O(n*n)
方法二
定义两个节点,分别指向头和尾,计算两数之和,小于指定值,头向后挪,大于制定值,尾向前挪
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum)
{
int len=array.size();
vector<int>result;
int i=0,j=len-1;
while(i<j)
{
int mysum=array[i]+array[j];
if(mysum<sum)
i++;
else if(mysum>sum)
j--;
else
{
result.push_back(array[i]);
result.push_back(array[j]);
break;
}
}
return result;
}
};
时间复杂度:O(n)