[leetCode][013] Two Sum 2

菜鳥加貝的爬升發表於2015-01-15

題目:

Given an array of integers that is already sorted in ascending order, find two numbers such that they add up to a specific target number.

The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.

You may assume that each input would have exactly one solution.

    Input: numbers={2, 7, 11, 15}, target=9
    Output: index1=1, index2=2

 

題意:請首先看"[leetCode][012] Two Sum 1",大家發現什麼異同了沒(沒發現的童鞋面壁去),這道題目僅僅更改了輸入條件,Input的陣列為已經排序的陣列,並且呈現升序。輸入條件變嚴格,我們依然可以使用前一篇問丈夫中的方法進行。那這裡既然為升序,我們能不能不使用前一種方法而又能夠達到O(n)時間複雜度呢? 答案是必然的。

 

key Point:

  陣列既然排序,元素之前的大小關係相對確定,存在的這一對元素必然處於相對固定的位置,我們可以使用兩個遊標,一個從頭部遍歷,一個從尾部遍歷,兩者所指元素之和如果偏大,調整後面的遊標,相反則調整前面的遊標。

 

坑:

  由於兩個int之和有可能出現INT_MAX的情況,所以如果輸入型別給定int,則我們需要使用long long型別來表示才能避免出現溢位的情況。

 

解答:

以下為C++實現程式碼:

 1 class Solution{
 2 public:
 3         std::vector<int> twoSum(std::vector<int> &numbers, int target){
 4         std::vector<int> vecRet;
 5         int nLeft = 0;
 6         int nRight = numbers.size() - 1;
 7 
 8         while (nLeft < nRight){
 9             // 小心兩個int之和溢位,使用long long型別
10             long long int nAdd = numbers[nLeft] + numbers[nRight];
11             if (nAdd == target){
12                 vecRet.push_back(nLeft + 1);
13                 vecRet.push_back(nRight + 1);
14 
15                 return vecRet;
16             }
17             else if (nAdd > target){
18                 nRight--;
19             }
20             else if (nAdd < target){
21                 nLeft++;
22             }
23         }
24 
25         return vecRet;
26     } 
27 };

 

執行結果:

  

希望各位看官不吝賜教,小弟感恩言謝。

相關文章