1. 程式人生 > >程式設計師面試一百題-10-在排序陣列中查詢和為給定值的兩個數字

程式設計師面試一百題-10-在排序陣列中查詢和為給定值的兩個數字

1-題目 :
輸入一個已經按升序排序過的陣列和一個數字,在陣列中查詢兩個數,使得它們的和正好是輸入的那個數字;要求時間複雜度是O(n);如果有多對數字的和等於輸入的數字,輸出任意一對即可。

2-示例 :
輸入 : 1、2、4、7、11、15和15
輸出 : 4、11

3-思路 :
注意是已經升序的陣列,所以我們維持兩個指標,分別指向第一個數和最後一個數。當兩個數的和小於期待的和時,向後移動前指標以增加和;當兩個數的和大於期待的和時,向前移動後指標以減小和;當相等時,輸出兩個數字並結束程式。

4-程式碼 :

//若存在則返回true,否則返回false
bool FindTwoNumbersWithSum(int data[], unsigned int length, int sum, int &num1, int &num2)
{
    bool found = false;
    if (length < 1)
    {
        return found;
    }

    int ahead = length - 1;
    int behind = 0;
    while (ahead > behind)
    {
        int curSum = data[ahead] + data[behind];
        //找到兩個數之和等於期待值
        if (curSum == sum)
        {
            num1 = data[ahead];
            num2 = data[behind];
            found = true;
            return found;
        }
        //若兩數之和小於期待值
        else if (curSum < sum)
        {
            behind++;
        }
        //若兩數之和大於期待值
        else
        {
            ahead--;
        }
    }
    //若沒有找到,則返回false
    return found;
}