Note:该文章只是个人想法,如果发现有什么问题,请留言!!!
3.1.7 一摞假币问题
a.
一摞一摞的称,重量最大的那一摞就是假币
最坏情况:O(n)
b.
至少需要称2次
3.1.14 交替放置的碟子
算法
//输入:T[0..2n-1]个黑白交替的盘子 //输出:T[0..2n-1]前n个事白盘子,后n个是黑盘子 for i <- 0 to n-1 do j <- i while(j < 2n-2-i) do swap(T[j], T[j+1]) j <- j+2
换位次数:
n u m = ∑ i = n 1 i = n ( n + 1 ) 2 num=\sum_{i=n}^1i=\frac{n(n+1)}{2} num=i=n∑1i=2n(n+1)
3.2.6
比较次数:
( m − 1 ) ∗ ( n − m + 1 ) 次 (m-1)*(n-m+1)次 (m−1)∗(n−m+1)次
3.2.8
a.
算法
//输入:S[0..n-1]字符串 //输出:以A开始B结尾的字符串的个数 BruteForceFindSubString(S[0..n-1]) count <- 0 for i <- to n-1 do if S[i]=='A' do for j <- i+1 to n-1 do if S[j] == 'B' count++ return count
效率类型:
O ( n 2 ) O(n^2) O(n2)
b.
算法
//输入:S[0..n-1] //输出:以A开始B结尾的字符串的个数 BruteForceFindSubString(S[0..n-1]) count <- 0 //记录总个数 t <- 0 //中间变量,记录访问过的A的个数 for i <- 0 to n-1 do if S[i]=='A' do t++ if t>0 && S[i]=='B' do count <- count+t return count
效率类型:
O ( n ) O(n) O(n)
3.3.6 奇数派游戏
对
3.4.6 划分问题
算法:
//输入:n个正整数T[0...n-1] //输出:两个不相交的集合并且两个集合的值相等 //下面这个算法是找到两个子集中的一个子集,剩下的就是用初始 //的减去找到的子集得到另一个子集 total <- sum(T[0..n-1]) if total % 2 == 1 return -1 else do T[0..n-1] <- sort(T[0..n-1]) m <- 0 n <- total/2 if T[n-1] > n return -1 else j <- 0 m <- T[n-1] M[j] <- m j++ for i <- n-2 to 0 do if m+T[i]>n continue else if m+T[i]==n M[j] <- T[i] return M else M[j] <- T[i] j++ m <- m+T[i] return -1
3.4.7 完备子图问题
算法
依次从图G的顶点出发,找到度数大于等于(k-1)的顶点个数,如果满足这样的顶点个数大于等于K个,就说明图G包含一个大小为k的完备子图。 伪代码: CliqueQuestions(G(v), k) //输入,图G(v),v为顶点的个数, 正整数k //输出,是否能找到一个具有k个节点的完备子图 count <- 0 //对满足要求的顶点数计数 for i <- 0 to v do if v[i] >= k-1 do //v[i]表示顶点的度数 count++ else do continue if count >= k do return true else do return false