面试题41:和为s的两个数字,和为s的连续正数序列
2017-03-06 14:12
260 查看
题目一:输入一个递增排序的数组和数字,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。
例如输入数组{1,2,4,7,11,15}和数字15,由于4+11=15,因此输出4和11。
思路:可以利用2个指针,分别指向数组的第一个元素和最后的一个元素,如果两元素之和大于我们输入的和,则将第二个指针向左移一位,如果两元素之和小于我们输入的和,则将第一个指针向右移一位。时间复杂度为O(n)。
bool FindNumbers(int *a, int length, int *num1, int *num2, int sum)
{
bool ret = false;
if(length < 1 || num1 == NULL || num2 == NULL)
return ret;
int low = 0;
int high = length - 1;
int s = a[low] + a[high];
while(low < high)
{
if(s > sum)
high--;
else if(s < sum)
low++;
else
{
ret = true;
break;
}
s = a[low] + a[high];
}
*num1 = a[low];
*num2 = a[high];
return ret;
}
题目2:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列,
1~5,4~6,7~8。
思路:同样是使用两个指针的思想,令low指向1,high指向2,当low和high指向的元素小于我们输入的和时,则令high向右移动,若小于,则令low向右移动,直到high到(1+s)/2为止。
void FindNumbers(int *num1, int *num2, int sum)
{
int low = 1;
int high = 2;
int s = low + high;
while(high <= sum/2+1)
{
if(s > sum)
low++;
else if(s < sum)
high++;
else
{
for(int i = low; i <= high; i++)
{
cout<<i<<" ";
}
cout<<endl;
low++;
}
s = (low+high)*(high-low+1)/2;;
}
}
例如输入数组{1,2,4,7,11,15}和数字15,由于4+11=15,因此输出4和11。
思路:可以利用2个指针,分别指向数组的第一个元素和最后的一个元素,如果两元素之和大于我们输入的和,则将第二个指针向左移一位,如果两元素之和小于我们输入的和,则将第一个指针向右移一位。时间复杂度为O(n)。
bool FindNumbers(int *a, int length, int *num1, int *num2, int sum)
{
bool ret = false;
if(length < 1 || num1 == NULL || num2 == NULL)
return ret;
int low = 0;
int high = length - 1;
int s = a[low] + a[high];
while(low < high)
{
if(s > sum)
high--;
else if(s < sum)
low++;
else
{
ret = true;
break;
}
s = a[low] + a[high];
}
*num1 = a[low];
*num2 = a[high];
return ret;
}
题目2:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列,
1~5,4~6,7~8。
思路:同样是使用两个指针的思想,令low指向1,high指向2,当low和high指向的元素小于我们输入的和时,则令high向右移动,若小于,则令low向右移动,直到high到(1+s)/2为止。
void FindNumbers(int *num1, int *num2, int sum)
{
int low = 1;
int high = 2;
int s = low + high;
while(high <= sum/2+1)
{
if(s > sum)
low++;
else if(s < sum)
high++;
else
{
for(int i = low; i <= high; i++)
{
cout<<i<<" ";
}
cout<<endl;
low++;
}
s = (low+high)*(high-low+1)/2;;
}
}
相关文章推荐
- 面试题41:和为s的两个数字VS和为s的连续正数序列
- 剑指offer 面试题41—和为s的两个数字VS和为s的连续正数序列
- 面试题41:和为s的两个数字VS和为s的连续正数序列
- 面试题41:和为s的两个数字VS和为s的连续正数序列
- [剑指offer][面试题41]和为s的两个数字 VS 和为s的连续正数序列
- 剑指Offer面试题41和为s的两个数字与和为s的连续正数序列,面试题42翻转单词顺序与左旋转字符串
- 面试题41:和为s的两个数字 VS 和为s的连续正数序列
- 剑指Offer面试题41(Java版):和为s的两个数字VS和为s的连续正数序列
- 剑指offer-面试题41-和为s的两个数字VS和为s的连续正数序列
- 【剑指Offer学习】【面试题41:和为s 的两个数字vs 和为s 的连续正数序列】
- 面试题41:和为s的两个数字VS和为s的连续正数序列
- 面试题41:和为s的两个数字VS和为s的连续正数序列
- 剑指Offer-面试题41-和为s 的两个数字vs 和为s 的连续正数序列
- 剑指offer 面试题41 和为 s 的两个数字 VS 和为 s 的连续正数序列
- 剑指offer之面试题41和为s的两个数字VS和为s的连续正数序列
- 剑指Offer_面试题41_和为s的两个数字 VS 和为s的连续正数序列
- 面试题41和为S的两个数字VS和为s的连续正数序列
- 《剑指Offer》学习笔记--面试题41:和为s的两个数字VS和为s的连续正数序列
- 【剑指offer】6.3知识迁移能力——面试题41:和为s的两个数字VS和为s的连续正数序列
- 面试题41:和为s的两个数字 || 和为s的连续正数序列