題目:
給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數(找出一組即可)。
示例:mums = [2,3,5,6,7]
target = 10
nums[1]+nums[4]=3+7=10
返回[1,4]
猛地一想,這不是很簡單麼,每次取兩個數,加起來看看是不是等於target就好了。具體地來說,就是遍歷陣列中的每個數,讓其與之後的數相加,看結果是否等於target。比如,取2, 分別與3,5,6,7相加;再取3,分別與5,6,7相加,依此類推,直到找到符合條件的兩個數為止。
這是最簡單直接的思路,乙個遍歷裡又巢狀有另乙個遍歷,當i=0,內迴圈執行n次;當i=1,內迴圈執行n-1次;…當i=n-1,內迴圈執行1次;所以sn=1+2+…n; sn=n(1+n)/2=n^2/2+n/2; 再加上外迴圈的執行次數n, tn=o(n^2/2+n/2;+n) ,根據只保留最高端項的原則,時間複雜度tn=o(n^2), 那有沒有時間複雜度低點的演算法呢?
有沒有一種不巢狀遍歷的方法呢,答案是肯定的。
我們可以把這個題目想成乙個相親會的例子。要在一群人當中,找出一對相互匹配的人兒來。根據上面所述的思路,我們先以第乙個人為基點,然後依次安排讓後面的人來和這個人相親;如果都沒有合適的,那我們就為第二個人依次安排相親見面會,依此類推。這個程式是不是煩鎖了點呢?
我們可以讓第乙個人說出自己的找物件標準,記在乙個小本本上,然後去找第二個人,看第二個人的條件匹配不匹配第乙個人的標準,同時,也把第二個人找物件標準也記在小本本上,再去找第三個人,看這個人的條件符不符合前面的人的條件,依次類推。也就是說,我們每次找人的時候都做了兩件事,看這個人是不是符合前面人的標準,同時也把這個人的找物件標準也記了下來。這樣一來,通過這個小本本,我們依次去問每乙個人,最多一次就夠啦。
回到演算法本身,用python實現如下:
在這裡,list就是這一群要找物件的人,target表示兩個人匹配成功的條件,map就是我們的小本本啦。
map裡記錄了前面的人的擇偶標準,如果當前找到的人和map裡的要求匹配,那我們就算完成任務,成功匹配到兩個人啦,如果沒有,那就把當前這個人的擇偶標準也記錄到小本本上,再去見下乙個人。
最後如果問完了所有人,都沒有合適的兩個人,那我們就只好return -1,-1, 表示沒有在這群人裡找到合適的兩個人。
這個思路的複雜度是o(n),其實與上乙個思路實質上不一樣的地方呢,就在於我們每找到乙個人,讓這個人與前面的人做匹配的同時,也記下這個人的匹配標準。
總結一下,遍歷的時候多儲存些資訊,也許就可以少些遍歷的操作,也就是常說的用空間來換時間啦。
更多演算法文章:
不含重複項的最長子串
左右括號問題
小偷問題
合併問題
每天一道演算法題
no.1 棧是特殊的線性表,它。a.對 b.錯答案 錯,它的插入和刪除都是在同一端進行的。no.2 n個葉子節點的滿二叉樹 除了葉子節點,每個節點都有兩個孩子 總共有多少個節點?a.2n 1 b.2n c.n 1 d.n答案 a 滿二叉樹我們講過了,度為0的節點比度為2的加點多乙個。滿二叉樹是特殊的...
每天一道演算法題
1.給定乙個只包括 的字串,判斷字串是否匹配。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。思路 正確思路 不需要考慮輸入內容是否合法,這只是做題,不是工程 定義乙個字典,後括號為鍵,前半部分為值 定義乙個元素儲存棧頂,注意這個設定,取棧...
每天一道演算法題
1 js計算某個字串出現的次數 j ascript計算乙個字串最多重複的字元及出現次數.var str zhaochucichuzuiduodezifu var o for var i 0,length str.length i length i else console.log o 輸出的是完整的...