1. 程式人生 > >從陣列中找出一對元素,其和是一個給定的目標數字。假設陣列中只存在一個符合要求的數值對,返回這些數值的下標

從陣列中找出一對元素,其和是一個給定的目標數字。假設陣列中只存在一個符合要求的數值對,返回這些數值的下標

【解題分析】對於陣列中某個下標i,如何判斷它是否屬於符合條件的兩個數字之一?最直觀的就是再次掃描數字,判斷target-array【i】是否存在於陣列中。這樣做時間複雜度O(n^2),效率不高,原因是沒有儲存之前的處理結果,每次都在做重複的工作。儘管效率不高,但通過最直觀的方法,發現處理當前節點需要依賴於之前的部分結果,如何儲存之前的處理結果?可以使用雜湊表。
既然需要回答“target-array【i】是否存在於陣列中”,那不妨把值作為鍵,通過詢問雜湊表是否含有所需要的鍵來得到回答。最終根據題目,需要返回下標,把下標作為雜湊表的值也非常自然了。
【複雜度分析】:先對陣列每個元素進行上述雜湊處理,再從頭至尾掃描陣列,判斷對應的另一個數是否存在於陣列中,時間複雜度O(n+n)。事實上,利用動態規劃思想,僅僅利用已經處理的部分解:雜湊表只儲存前驅結點的資訊。對於當前節點,判斷前驅中是否含有對應值。當處理完當前節點,把當前節點加入雜湊表,作為已經處理的部分解。這樣時間複雜度可以進一步減小為O(n)。
參考程式碼:

vector<int> addsToTarget(vector<int> &numbers, int target)
{
    unordered_map<int, int> numToIndex;
    vector<int> vi(2);
    for(auto it=numbers.begin();it!=numbers.end();it++)
    {
        if(numToIndex.count(target-*it))
        {
            vi[0]=numToIndex[target-*it]+1
; vi[1]=(int)(it-numbers.begin())+1; return vi; } numToIndex[target-*it]=(int)(it-numbers.begin()); } }

這裡使用到一個雜湊表numToIndex,它的key是vector中的數字,value是key在vector中的下標。
for迴圈中使用auto變數it,是遍歷vector容器的迭代器,it是指向vector某元素的位置,*it是vector在it位置處的值。