• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
james1207

博客园    首页    新随笔    联系   管理    订阅  订阅

两个数之和等于第三个数

      这是一个很好的算法题,解法类似于快速排序的整理方法。同时,更为值得注意的是这道题是 人人网2014校园招聘的笔试题,下面首先对题目进行描述:

      给出一个有序数组,另外给出第三个数,问是否能在数组中找到两个数,这两个数之和等于第三个数。

      我们首先看到第一句话,这个数组是有序的,所以,我们可以定义两个指针,一个指向数组的第一个元素,另一个指向应该指向的位置(这个需要看具体的实现和数组给定的值),首先计算两个位置的和是否等于给定的第三个数,如果等于则算法结束,如果大于,则尾指针向头指针方向移动,如果小于,则头指针向尾指针方向移动,当头指针大于等于尾指针时算法结束,没有找到这样的两个数。

      它看起来就好像下面这张图一样:


      下面给出具体的实现:

 

#include <stdio.h>

int 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("can't 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;
}


      这样就以高效的方法得到了结果。

 

 

posted @ 2013-09-16 19:28  Class Xman  阅读(551)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3