程式設計之美 03

2022-07-09 19:24:10 字數 2541 閱讀 6796

3、題目:能否快速找出乙個陣列(簡單起見,陣列中元素值各不一樣)中的兩個數字,讓這兩個數字之和等於乙個給定的值。

例如,給定陣列arr(如下圖),給定值key為12,則arr[0](5)、arr[4](7)滿足要求。

解法一、窮舉法

窮舉說白了就是不斷試,題目為從陣列中找兩個滿足條件的數字,即把陣列看成兩份,遍歷第乙份中的所有去第二份裡面找是否存在滿足條件的數字。

思路:窮舉陣列中任意的兩兩組合,並計算取出的兩個數之和是否等於給定值即可,通過窮舉計算時間複雜度為o(n * n)。對於求和計算具有的對稱性,當遍歷陣列取出資料時,只需向後取值即可(如下圖)。

演算法:1、遍歷陣列,從第乙個至最後乙個,依次取出陣列中的元素a;

2、遍歷該元素所在位置後的元素b,計算a + b是否等於給定值,直至相等;

**:

public

int getpairsfromarray(int arr, int

key) }}

return ispartnerin ? partner : new

int[0];

}

窮舉法——改進版(感謝  @ck_winner 提供的思路)

思路:以給定值的二分之一(part)為分割數,將陣列分割成兩部分,其中,左部分小於part值,右邊部分大於part值。由於本題中陣列中的元素值不同,則如存在兩個數之和為給定數,則這兩個數必分屬左邊和右邊部分,再通過上面的窮舉方式進行查詢即可。具體過程可見下圖:

演算法:1、通過給定數值的二分之一作為分割數,將陣列分割成左右兩部分;

2、遍歷左部分數值a,右部分數值b,計算a + b是否等於給定值,直至相等;

private

int partition(int arr, int

key)

return

j; }

public

int getpairsfromarray4(int arr, int

key) }}

return ispartnerin ? partner : new

int[0];

}

解法

二、無序變有序

將無序陣列有序化是處理無序陣列常用方法,有序陣列有較多較好的處理方法,如雙端遍歷,二分查詢等,通過這些方法可以使處理過程變得簡化。

思路:先將無序陣列有序化(通過快排方式,計算時間複雜度為o(n * log n)),排序後可採用雙向陣列遍歷方式(如下圖)。若arr[i] + arr[j]等於給定值key,直接返回;若arr[i] + arr[j]小於給定值key,則i向後位移一位;若arr[i] + arr[j]大於給定值key,則j向前位移一位。計算時間複雜度為o(n * log n + n);

計算:1、通過快排演算法將無序陣列有序化;

2、採用雙端遍歷方式,設定i和j分別為陣列兩端index;若arr[i] + arr[j] = key,返回結果;若arr[i] + arr[j] < key,i++;若arr[i] + arr[j] > key,j--;

**:

public

int getpairsfromarray2(int arr, int

key)

else

if((arr[i] + arr[j])

else

}return ispartnerin ? partner : new

int[0];

}

解法三、hash表

之前討論過bitmap,關係對映表等,形式雖然多樣,實則都為空間換時間的方法,通過構造空間位置(key)與值(value)的對映關係,使得通過空間位置(key)取值(value)時間複雜度為o(1)。

思路:將陣列中的元素放入bitmap中,然後再遍歷陣列中的所有元素,判定bitmap中給定元素值-陣列元素值位置是否存在。由於bitmap取值時間複雜度為o(1),整個計算時間複雜度為o(n),構造bitmap需要空間為o(m),其中m為陣列最大數;

計算:1、構造bitmap表,將陣列中所有元素放入bitmap表中;

2、再次遍歷陣列中所有元素,並判斷bitmap表中key-arr[i]是否存在;

**:

public

int getpairsfromarray(int arr, int

key)

int partner = new

int[2];

boolean ispartnerin = false

;

for (int i = 0; i < arr.length && !ispartnerin; i++)

}return ispartnerin ? partner : new

int[0];

}

推薦《程式設計之美》

推薦 程式設計之美 我很早知道鄒欣計畫要寫這樣一本書,也能夠預計到這本書定會廣受歡迎,因為它符合當前大量求職人員的需求,畢竟於他們而言,誰不想知道微軟亞洲研究院在招人時候問些什麼問題呢。另一方面,把考察軟體技術人員專業知識和相應技能的各種手段加以歸納和整理,這本身也是對業界的貢獻,所以,我相信,一旦...

程式設計之美摘錄

第1章 遊戲之樂 遊戲中碰到的題目 1.1讓cpu佔用率曲線聽你的指揮 int main return 0 解法二 使用gettickcount 和sleep 解法三 能動態適應的解法 1.2中國象棋將帥問題 1.3一摞烙餅的排序 1.4買書問題 1.5快速找出故障機器 1.6飲料供貨 1.7光影切...

程式設計之美 2 2

1 階乘確實是乙個讓人頭疼的問題,其本身的實現很簡單,它的問題在於結果膨脹式的增長會造成n!的結果的溢位。2.2給出了幾種從數學角度出來的思路,可以避免上面的問題發生。首先要清楚的乙個問題就是質因數分解 給定任意乙個整數w,那麼w一定可以分解成w 2 x 3 y 5 m 這種形式,這個數學理論是解決...