日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

程序员面试题精选100题(10)-排序数组中和为给定值的两个数字[算法]

發布時間:2025/3/21 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 程序员面试题精选100题(10)-排序数组中和为给定值的两个数字[算法] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

例如輸入數組1、2、4、7、11、15和數字15。由于4+11=15,因此輸出4和11。

分析:如果我們不考慮時間復雜度,最簡單想法的莫過去先在數組中固定一個數字,再依次判斷數組中剩下的n-1個數字與它的和是不是等于輸入的數字。可惜這種思路需要的時間復雜度是O(n2)。

我們假設現在隨便在數組中找到兩個數。如果它們的和等于輸入的數字,那太好了,我們找到了要找的兩個數字;如果小于輸入的數字呢?我們希望兩個數字的和再大一點。由于數組已經排好序了,我們是不是可以把較小的數字的往后面移動一個數字?因為排在后面的數字要大一些,那么兩個數字的和也要大一些,就有可能等于輸入的數字了;同樣,當兩個數字的和大于輸入的數字的時候,我們把較大的數字往前移動,因為排在數組前面的數字要小一些,它們的和就有可能等于輸入的數字了。

我們把前面的思路整理一下:最初我們找到數組的第一個數字和最后一個數字。當兩個數字的和大于輸入的數字時,把較大的數字往前移動;當兩個數字的和小于數字時,把較小的數字往后移動;當相等時,打完收工。這樣掃描的順序是從數組的兩端向數組的中間掃描。

問題是這樣的思路是不是正確的呢?這需要嚴格的數學證明。感興趣的讀者可以自行證明一下。

參考代碼:

/// // Find two numbers with a sum in a sorted array // Output: ture is found such two numbers, otherwise false /// bool FindTwoNumbersWithSum (int data[], // a sorted arrayunsigned int length, // the length of the sorted array int sum, // the sumint& num1, // the first number, outputint& num2 // the second number, output ) {bool found = false;if(length < 1)return found;int ahead = length - 1;int behind = 0;while(ahead > behind){long long curSum = data[ahead] + data[behind];// if the sum of two numbers is equal to the input// we have found themif(curSum == sum){num1 = data[behind];num2 = data[ahead];found = true;break;}// if the sum of two numbers is greater than the input// decrease the greater numberelse if(curSum > sum)ahead --;// if the sum of two numbers is less than the input// increase the less numberelsebehind ++;}return found; }



擴展(1):輸入一個數組,判斷這個數組中是不是存在三個數字i, j, k,滿足i+j+k等于0。在我的英文博客http://codercareer.blogspot.com/2011/10/no-09-numbers-with-given-sum.html里詳細討論了這個題目。

擴展(2):如果輸入的數組是沒有排序的,但知道里面數字的范圍,其他條件不變,如何在O(n)時間里找到這兩個數字?這個的基本思路是先用哈希表實現O(n)的排序(請參照本面試題系列的第57題),接下來的步驟都一樣了。

本文已經收錄到《劍指Offer——名企面試官精講典型編程題》一書中,有改動,書中的分析講解更加詳細。歡迎關注。

?????????? 本題已被九度Online Judge系統收錄,歡迎讀者移步到http://ac.jobdu.com/hhtproblems.php在線測試自己的代碼。

博主何海濤對本博客文章享有版權。網絡轉載請注明出處http://zhedahht.blog.163.com/。整理出版物請和作者聯系。

總結

以上是生活随笔為你收集整理的程序员面试题精选100题(10)-排序数组中和为给定值的两个数字[算法]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。