《演算法》1 4節部分題解

2021-10-03 08:36:04 字數 4126 閱讀 5601

14

4-sum。為4-sum設計乙個演算法。

public

intfoursum

(int

a)else

if(a[l]

+ a[i]

+ a[j]

+ a[k]

>0)

else}}

}return cnt;

}

15

快速3-sum。作為熱身,使用乙個線性級別的演算法實現twosumfaster來計算已排序的陣列中和為0的整數對的數量。用相同的思想為3-sum問題給出乙個平方級別的演算法。

雙指標法前後夾擊

public

class

twosumfaster

else

if(a[j]

+ a[k]

>0)

else

}return cnt;

}}

類似的:

public

class

threesumfaster

else

if(a[j]

+ a[k]

+ a[h]

>0)

else}}

return cnt;

}}

16

最接近的一對(一維)。

public

static

void

closestpair

(double

arr)

} system.out.

println

(arr[index1]

+" "

+ arr[index2]);

}

17

最遙遠的一對(一維)。

public

static

void

farthestpair

(double

arr)

system.out.

println

(arr[max]

+" "

+ arr[min]);

}

18

陣列的區域性最小元素。

1、找到乙個區域性最小元素即可,不用找全。

2、陣列可能含有0個元素。

3、優先檢查區間端點處的單邊極值。

public

static

intlocalmin

(int

arr)

return left;

}

19

矩陣的區域性最小元素。

中文版翻譯有誤,此題要求的執行時間和n

log⁡

nn\log n

nlog

n成正比,否則無法模擬上一題。

不過的確有o(n)的實現。

官網原文:

local minimum in a matrix. given an n-by-n array a of n

2n^2

n2distinct integers, design an algorithm that runs in time proportional ton log nto find a local minimum: an pair of indices i and j such that a[i][j] < a[i+1][j], a[i][j] < a[i][j+1], a[i][j] < a[i-1][j], and a[i][j] < a[i][j-1] (assuming the neighboring entry is in bounds).

extra credit: design an algorithm that takes times proportional ton.

找到第n/2行中的最小項,比如a[n/2][j]。如果是區域性最小值,則返回。否則,檢查它上下兩個相鄰元素a[n/2-1][j]和a[n/2+1][j],在較小的相鄰元素的半邊中重複。

static

class

pos}

private

static

intminpos

(int

a)return min;

}public

static pos binarysearch

(int

arr)

int up =1;

int down = arr.length -2;

int mid =0;

int min =0;

while

(up <= down)

return

newpos

(mid, min)

;}

22

僅使用加減實現的二分查詢。(斐波那契查詢)

private

static

int[

] f;

public

static

intinit

(int n)

return i;

}public

static

intfibonaccisearch

(int key,

int[

] arr)

else

if(key > tmp[mid]

)else

}return-1

;}

24

扔雞蛋。假設你面前有一棟n層的大樓和許多雞蛋,假設將雞蛋從f層或更高的地方扔下,雞蛋才會碎,否則不會碎。首先,設計一種成本為摔碎雞蛋的數量為~lgn的策略來確定f的值,然後想辦法將成本降低到~2lgf。

思路:前者的實現就是二分查詢,這裡就不寫了。後者的實現是o(lgf)的,而我們並不知道f是多少,所以只能從1開始加倍,直到我們能讓雞蛋破碎的高度up為止,這裡的成本是~lgf的,然後在這個高度和它的一半的位置down之間用二分查詢來找f,這裡的成本也是~lgf的,所以加起來就是~2lgf。

需要注意的是,我們只知道能否打碎雞蛋,也就是我們只知道mid是否》=f,所以這裡的二分查詢要精確到up和down重合為止。

public

static

intthrowegg

(int n)

return up;

}

25

扔兩個雞蛋。和上一題相同,但現在你只有兩個雞蛋,而你的成本模型則是扔雞蛋的次數。設計一種策略,最多扔2

n2\sqrt

2n​次雞蛋即可判斷f的值,然後想辦法把這個成本降低到~c

fc\sqrt

cf​次。

前者實現:把乙個雞蛋從第n

\sqrt

n​層、第2

n2\sqrt

2n​層、第3

n3\sqrt

3n​層……扔下去,直到它在第k

nk\sqrt

kn​層破碎為止,然後把另乙個雞蛋從第(k−

1)

n(k-1)\sqrt

(k−1)n

​層開始逐層往上向下丟,直到破碎位置,那一層就是f層。

public

static

intthrowtwoeggs

(int n)

後者實現:和第24題的第二種實現類似,我們從第1層開始找 i

2i^2

i2的層,直到雞蛋破碎,然後線性搜尋即可。

public

static

intthrowtwoeggs

(int n)

34

熱還是冷。設計乙個演算法在~2lgn之內猜出1到n之間的乙個秘密的整數,再設計乙個演算法在~1lgn之內找到這個數。

~2lgn:每次猜區間端點來縮小區間

public

static

inthotorcold

(int n)

}

演算法導論12 2節習題解答

clrs 12.2 1 c錯,240及240之後的節點應該都為911左子樹上的節點,那麼所有節點必然小於或等於911,但點912明顯違反了。clrs 12.2 2 search minimum x if left x nil search minimum left x return x search...

haskell基礎題解(14)

題目 用自然數蛇形填充乙個 n 階的方陣。當n 5時,形如 這個問題用 haskell 解決時與 題目13 差別甚微。實際上,從函式式的思考習慣看,只要讓有些行作成後反轉一下就可以了。上 ju n f x x 0.n 1 where f row even row take n row n 1.odd...

第二節 14常量

using system using system.collections.generic using system.linq using system.text 常量與靜態成員 const常量,常量名要大寫 不用new就能用的方法 static方法,static方法其實就是普通的函式 在stati...