您的位置:首页 > 其它

在排序数组中查找和为定值的两个元素

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐