我是靠谱客的博主 愤怒云朵,最近开发中收集的这篇文章主要介绍面试-算法 已经排好序的数组中求两个数的和等于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

最后

以上就是愤怒云朵为你收集整理的面试-算法 已经排好序的数组中求两个数的和等于N的全部内容,希望文章能够帮你解决面试-算法 已经排好序的数组中求两个数的和等于N所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部