從乙個陣列中找到和為定值的兩個數

2021-06-20 22:44:08 字數 1089 閱讀 6172

問題:從乙個陣列中,找出兩個數,使其和滿足一定的值sum。

演算法的本質,就是構造解空間,然後根據解的特點,把不符合條件的解從中去掉。

就這個問題而言,我們從陣列中取出乙個數,那麼我們如何判斷這個數是不是兩個數之一呢?

很明顯,以現在的情況,還不能否定這個數,那麼怎麼辦?

假設,我告訴你,這是這根陣列中最小的數(記為a),我問你,這個最小的數能不能被你排除掉?

還是不能,因為這要取決另乙個數。

好,那我們暫且認為這個數是,那麼剩下的一堆數中再取出乙個數(記為b),如何判斷這個數要不要呢?

這時,就好辦了,兩個數一加,是就是,不是就不是。那完事之後呢,我們又不知道怎麼辦了,再從剩下的陣列元素中取出乙個數跟a合作?這樣的方法,傻子都能想到。

現在的問題是,我們所作的工作(即取出兩個數),沒有拿到滿意的解也就算了,對我們下一步也沒有指導作用。(如果有,也不算白幹啊,就當我交學費了啊)

那好,還是老方法,給他們加更多的資訊,我們有方法,讓取到的第二個數也有個身份,那該是什麼身份呢?

可以推知,選擇還是很多的,第二小的數,第三小的數,……最大的數

如果b為第二小的數

if  a+b > sum   說明game over

if  a+b = sum   也說明game可以over了

if  a+b < sum   好吧,我打算試下乙個

很明顯,第三小的數也是這麼搞,那如果b是最大的數呢?

if  a+b < sum   雖然還沒有搞出來,但說明乙個問題,a不可能是兩個數之一

if  a+b = sum   game可以over了

if  a+b > sum   還好,這回可以把b給pass掉了

so,我想起來高中物理老師說的一句話,選擇題如何做對啊?不選錯的就可以了嘛!現在看來,不是廢話啊!

排完序之後,搞兩個「指標」,乙個在左邊往右走,乙個在右邊往左走。

記住,我們不是想要找到最後結果,我們只是想把不符合條件的踢出去。

小結:這個方法不是我想的,我是在網上看的,感覺這個方法很巧,雖然它借鑑了快排的一些思路。然後,晚上沒事幹,加上了自己的想法,希望理解起來可以更平順一點。由此可知,自己是個後知後覺的貨,也不是研究演算法的料,聊以為樂而已。

陣列 尋找和為定值的兩個數

題目描述 給定乙個陣列和乙個整數,要求在陣列中找到兩個數,使得它們的和為這個整數.方法 排序夾逼 首先使用快速排序演算法把陣列按公升序排列,然後使用夾逼的方法找到答案.即使用兩個指標分別指向陣列的頭和尾 begin,end 1.若arr begin arr end sum 就輸出 2.若arr be...

和為定值的兩個陣列元素

在陣列中找到和為定值的兩個數,返回陣列下標。這個題目就是乙個排序的問題,但是不能改變陣列,用快排的方式儲存陣列的索引值即可,上 include include include include using namespace std void quicksort index int arr,int i...

尋找和為定值的兩個或多個數

一 尋找和為定值的兩個數 題目 輸入乙個陣列和乙個數字,在陣列中查詢兩個數,使得它們的和正好是輸入的那個數字。要求時間複雜度是o n 如果有多對數字的和等於輸入的數字,輸出任意一對即可。例如輸入陣列1 2 4 7 11 15和數字15。由於4 11 15,因此輸出4和11。詳情參考 用乙個hash表...