网站建设总体流程,wordpress 搜索记录表,全屋定制设计指南,深圳注册公司网址这是一个很好的算法题#xff0c;解法类似于快速排序的整理方法。同时#xff0c;更为值得注意的是这道题是 人人网2014校园招聘的笔试题#xff0c;下面首先对题目进行描述#xff1a; 给出一个有序数组#xff0c;另外给出第三个数#xff0c;问是否能在数组中找到两个… 这是一个很好的算法题解法类似于快速排序的整理方法。同时更为值得注意的是这道题是 人人网2014校园招聘的笔试题下面首先对题目进行描述 给出一个有序数组另外给出第三个数问是否能在数组中找到两个数这两个数之和等于第三个数。 我们首先看到第一句话这个数组是有序的所以我们可以定义两个指针一个指向数组的第一个元素另一个指向应该指向的位置这个需要看具体的实现和数组给定的值首先计算两个位置的和是否等于给定的第三个数如果等于则算法结束如果大于则尾指针向头指针方向移动如果小于则头指针向尾指针方向移动当头指针大于等于尾指针时算法结束没有找到这样的两个数。 它看起来就好像下面这张图一样 下面给出具体的实现 #include stdio.hint judge(int *a, int len, int k, int *num1, int *num2);int main(int argc, char **argv)
{int test_array[] {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};int result -1;int num1, num2;result judge(test_array, sizeof(test_array) / sizeof(int), 12, num1, num2);if(result 0){printf(%d\t%d\n, num1, num2);}else if(result -1){printf(cant find);}else{printf(error);}
}int judge(int *a, int len, int k, int *num1, int *num2)
{int *low NULL;int *high NULL;int i 0;int result -1;if(a NULL || len 2){return result;}if(a[0] k){return result;}while(a[i] k i len){i;}low a;high a i - 1;while(low high){*num1 *low;*num2 *high;if((*low *high) k){result 0;break;}else if((*low *high) k){high--;}else if((*low *high) k){low;}}return result;
}这样就以高效的方法得到了结果。 转载于:https://www.cnblogs.com/james1207/p/3324943.html