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...