面试-算法 已经排好序的数组中求两个数的和等于N

已知一个拍好序的数组,长度为M

在其中找两个数,其和为N

 

刚刚拿到这个题目的时候,首先的常规想法是遍历循环求出所有数的和,最终其值为N的就是结果,这个算法时间复杂度为o(N*N)

可能还有一些扩展的想法,那就是先把数组中比N大的元素去掉,这样少检查几个元素

这是典型的程序员思维,太早开始考虑实现细节了

作为一个算法题目首先要把算法复杂度降低下来,然后再考虑常数C。。。不要太早开始考虑这种相对不重要的问题

 

由于要寻找的是一个数对,假设这里存在解的话,考虑用N减去数组中的每一个值

生成一个新数组M2,假设M2的值在M中出现,那么就可以找到解,(用两个指针 一个从M的左边 一个从M2的右边)

算法复杂度可以做到o(N)

 

代码如下

        public static void Test()
{
List<int> array = new List<int>() { 1, 2, 3, 4, 5, 6, 5, 6, 565, 33, 35, 7, 9, 33, 4, 12, 13, 14, 15, 16, 17, 18, 19, 02, 234, 23, 45, 46, 48 };
array.Sort();
Test1(array.ToArray());
}
public static void Test1(int[] array)
{
int N = 49;
int[] array2 = new int[array.Length];

for (int i = 0; i < array.Length; i++)
{
array2[i] = N - array[i];
}

int startI = 0;
int startJ = array.Length - 1;
while ((startI != array.Length - 1) || (startJ != 0))
{
if (array[startI] == array2[startJ])
{
Console.Write(startI + ":" + array[startI] + "+" + startJ + ":" + array[startJ]);
return;
}
else if (array[startI] > array2[startJ])
{
startJ--;
}
else
{
startI++;
}
}
}
}



转载于:https://www.cnblogs.com/PurpleTide/archive/2011/12/23/2300016.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值