这道题有两个关键点,第一是数组有序,第二是时间复杂度是0(n)。
思路:可以从数组最后一个往前循环,那么最小的肯定在最前面。同理从前面往后面循环也是一样的,注意退出的关键点即可。
改良代码:
static string GetAddendsNew(int[] arrAddends, int sum)
{
for (int i = 0, j = arrAddends.Length - 1; j > i; )
{
if (arrAddends[j] + arrAddends[i] > sum)
{
j--;
}
else if (arrAddends[j] + arrAddends[i] < sum)
{
i++;
}
else if (arrAddends[i] + arrAddends[j] == sum)
{
return arrAddends[i].ToString() + "|" + arrAddends[j].ToString();
}
}
return string.Empty;
}
简单代码:
static string GetAddends(int[] arrAddends,int sum)
{
int j = 0;
for (int i = arrAddends.Length-1; i >= 0; i--)
{
if (arrAddends[i] < sum)
{
int nTemp = sum - arrAddends[i];
for (int k = j; k < arrAddends.Length-2; k++)
{
if (arrAddends[k] == nTemp)
{
return i.ToString() + "|" + k.ToString();
}
else if (arrAddends[k + 1] > nTemp)
{
j = k;
break;
}
}
}
}
return string.Empty;
}