在排序数组中查找和为定值的两个元素
2014-09-01 14:51
393 查看
题目:已知一个已经按升序排好序的数组,现在输入一个数值sum,在数组中查找两个数,使得这两个数的和正好是输入的sum,打印出这两个数,如果存在多对这样的数,依次打印出来。
如:array[] = {2,5,8,10,12,14,18,20},输入sum=28,那么打印出(8,20) (10,18)
算法思想1:最傻瓜的算法,先在数组中固定一个值,然后依次遍历数组中其余的值,如果有两个数的和恰好等于sum,那么输出这两个值(一个是固定的值,一个是遍历数组中满足要求的值),算法复杂度为O(n²)
typedef struct pair
{
int num1;
int num2;
}value_t;
vector<value_t> findElemBySumSol1(int array[], int size, int sum)
{
vector<value_t> container;
value_t pair_value;
for(int i = 0; i < size; i++)
{
for(int j = i+1; j < size; j++)
{
if(array[i] + array[j] == sum)
{
pair_value.num1 = array[i];
pair_value.num2 = array[j];
container.push_back(pair_value);
}
}
}
return container;
}
算法思想2:遍历数组的每个值,针对每个值,temp=sum-当前值,然后在数组中利用二分查找法查找temp是否存在于剩余的数组元素中,如果存在,输出当前这和temp,算法复杂度为O(nlogn)
bool binarySearch(int array[], int first, int last, int key)
{
int low = first;
int high = last;
int middle;
bool isFound = false;
while(low <= high)
{
middle = low + (high - low) / 2;
if(key == array[middle])
{
isFound = true;
break;
}
else if(key > array[middle])
{
low = middle + 1;
}
else
{
high = middle - 1;
}
}
return isFound;
}
vector<value_t> findElemBySumSol2(int array[], int size, int sum)
{
vector<value_t> container;
value_t pair_value;
int temp;
for(int i = 0; i < size; i++)
{
temp = sum - array[i];
//找到了
if(binarySearch(array, i+1, size, temp) == true)
{
pair_value.num1 = array[i];
pair_value.num2 = temp;
container.push_back(pair_value);
}
}
return container;
}
算法思想3:首先找到数组中的第一个元素n和最后一个元素m,然后计算他们的和n+m,如果(n+m>输入值sum),那么把较大的数字index向前移动,如果(n+m<sum),那么把较小的数字index向后移动,直到找到n+m==sum。算法复杂度为O(n)
vector<value_t> findElemBySumSol3(int array[], int size, int sum)
{
int first = 0;
int last = size - 1;
vector<value_t> container;
value_t pair_value;
int temp_sum;
while(first < last)
{
temp_sum = array[first] + array[last];
if(temp_sum == sum)
{
pair_value.num1 = array[first];
pair_value.num2 = array[last];
container.push_back(pair_value);
++first;
//找到后继续往后找
}
else if(temp_sum > sum)
{
--last;
}
else
{
++first;
}
}
return container;
}
如:array[] = {2,5,8,10,12,14,18,20},输入sum=28,那么打印出(8,20) (10,18)
算法思想1:最傻瓜的算法,先在数组中固定一个值,然后依次遍历数组中其余的值,如果有两个数的和恰好等于sum,那么输出这两个值(一个是固定的值,一个是遍历数组中满足要求的值),算法复杂度为O(n²)
typedef struct pair
{
int num1;
int num2;
}value_t;
vector<value_t> findElemBySumSol1(int array[], int size, int sum)
{
vector<value_t> container;
value_t pair_value;
for(int i = 0; i < size; i++)
{
for(int j = i+1; j < size; j++)
{
if(array[i] + array[j] == sum)
{
pair_value.num1 = array[i];
pair_value.num2 = array[j];
container.push_back(pair_value);
}
}
}
return container;
}
算法思想2:遍历数组的每个值,针对每个值,temp=sum-当前值,然后在数组中利用二分查找法查找temp是否存在于剩余的数组元素中,如果存在,输出当前这和temp,算法复杂度为O(nlogn)
bool binarySearch(int array[], int first, int last, int key)
{
int low = first;
int high = last;
int middle;
bool isFound = false;
while(low <= high)
{
middle = low + (high - low) / 2;
if(key == array[middle])
{
isFound = true;
break;
}
else if(key > array[middle])
{
low = middle + 1;
}
else
{
high = middle - 1;
}
}
return isFound;
}
vector<value_t> findElemBySumSol2(int array[], int size, int sum)
{
vector<value_t> container;
value_t pair_value;
int temp;
for(int i = 0; i < size; i++)
{
temp = sum - array[i];
//找到了
if(binarySearch(array, i+1, size, temp) == true)
{
pair_value.num1 = array[i];
pair_value.num2 = temp;
container.push_back(pair_value);
}
}
return container;
}
算法思想3:首先找到数组中的第一个元素n和最后一个元素m,然后计算他们的和n+m,如果(n+m>输入值sum),那么把较大的数字index向前移动,如果(n+m<sum),那么把较小的数字index向后移动,直到找到n+m==sum。算法复杂度为O(n)
vector<value_t> findElemBySumSol3(int array[], int size, int sum)
{
int first = 0;
int last = size - 1;
vector<value_t> container;
value_t pair_value;
int temp_sum;
while(first < last)
{
temp_sum = array[first] + array[last];
if(temp_sum == sum)
{
pair_value.num1 = array[first];
pair_value.num2 = array[last];
container.push_back(pair_value);
++first;
//找到后继续往后找
}
else if(temp_sum > sum)
{
--last;
}
else
{
++first;
}
}
return container;
}
相关文章推荐
- 程序员面试题目总结--数组(三)【旋转数组的最小数字、旋转数组中查找指定数、两个排序数组所有元素中间值、数组中重复次数最多的数、数组中出现次数超过一半的数】
- 第1题 在排序数组中查找和为某个指定数的两个元素之和
- 在两个排序数组中查找第k小元素
- 面试算法:lg(k)时间查找两个排序数组合并后第k小的元素
- 在排序数组中查找和为给定值的两个数字
- 程序员面试题精选(10)-在排序数组中查找和为给定值的两个数字
- 在数组中查找和为给定值的两个数字(排序数组和不排序数组)
- 程序员面试题精选100题(10)-在排序数组中查找和为给定值的两个数字
- 查找两个已经排好序的数组的第k大的元素
- 在排序数组中查找和为给定值的两个数字
- 程序员面试题精选100题(10)-在排序数组中查找和为给定值的两个数字
- 如何查找到两个数组中不相同的元素.
- 在排序数组中查找和为给定值的两个数字
- 查找两个已经排好序的数组的第k大的元素
- 程序员面试题精选100题(10)-在排序数组中查找和为给定值的两个数字
- 程序员面试题精选(10)-在排序数组中查找和为给定值的两个数字
- 100题_10 在排序数组中查找和为给定值的两个数字
- 在排序数组中查找和为给定值的两个数字
- 在排序数组中查找和为给定值的两个数字
- 用HashSet查找两个int数组中的相同元素