今天一起的同事问了一道面试的算法题,感觉很有意思,拿来和大家分享一下:
题目:判断一个有序数组中是否有两个数的和等于给定的数
思想很简单就是利用折半的原理,下面是我的程序和相应的注释
/// <summary>
/// 判断一个有序数组中是否有两个数的和等于给定的数
/// </summary>
/// <param name="source">已经是升序的源数组</param>
/// <param name="sum">目标和</param>
/// <returns>是否找到符合条件的元素</returns>
public static bool FindSumItem(int[] source, int sum)
{
//算出和的一半是多大.
int mid = sum / 2;
//第一个数的下标.
int i=0;
//把数组中不大于和一半的元素做为第一个加数.
while (i< source.Length && source[i] <= mid)
{
//第二个加数的下标.
int j=i+1;
while (j < source.Length - 1)
{
//两个数的和太小,第二个加数的小标后移.
if(source[i] + source[j] < sum)
{
j++;
}
else
{
//两个数的刚好,返回ture.
if (source[i] + source[j] == sum)
{
return true;
}
else
{
//当前的第二个加数已经太大,往后移已经没有意义,跳出循环,移动第一个加数.
break;
}
}
}
//移动第一个加数.
i++;
}
//一半的元素已经判断完,没有找到合适的元素,返回false.
return false;
}