找出和值等于指定值的元素,如有序数组{1,2,6,23,43,64},求和等于25的两个和数则将是元素2和23,时间复杂度是0(n)。
2011-06-28 17:21
357 查看
这道题有两个关键点,第一是数组有序,第二是时间复杂度是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;
}
思路:可以从数组最后一个往前循环,那么最小的肯定在最前面。同理从前面往后面循环也是一样的,注意退出的关键点即可。
改良代码:
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;
}
相关文章推荐
- 从数组中找出两个元素的和等于指定数值,并输出位置。
- Two Sum(找出数组中两个和等于指定数字的元素)
- 写一个功能函数实现从数组中找出两个值相加等于某一个值,要求时间复杂度为 n;
- 一个整型数组里除了一个或者两个或者三个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)
- 【算法王道】找到数组中两个元素相加等于指定数
- java实现 数组中两个元素相加等于指定数的所有组合
- 将数组中所有小于或等于0的元素都放在数组前面,大于0的元素放在数组后面。要求时间复杂度为o(n)
- O(lgn)时间内找出有序数组中某个元素出现的次数
- C语言合并两个有序数组,时间复杂度为O(n),空间复杂度O(1)
- 排序数组,找出两个和等于指定数
- 迅速找出数组a中是否存在相加后等于整数x的两个元素
- 找出有序元素数组中指定元素出现的次数
- 两个有序整形数组找出二者相同的元素和不同的元素
- 给定一个值S,在有序数组中找出两个元素A和B,使 A+B = S.
- 找出两个有序数组的公共元素
- O(lgn)时间内找出有序数组中某个元素出现的次数
- 给定一个值S,在有序数组中找出两个元素A和B,使 A+B = S.
- merge两个有序数组 & 查找一个有序数组中指定元素
- 设计一个算法找到数组中两个元素相加等于指定数的所有组合
- 借鉴快速排序的思想,实现算法将整型数组a[0...n]分成两块,使得第一块元素均大于等于0,第二块的元素均小于0,要求算法原地工作且时间复杂度为O(n)