面試-算法 已經排好序的數組中求兩個數的和等於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++;
}
}
}
}




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM