4-2:
題目描述:
某數組A[1,2,...n]含有所有從0到n的證書,但其中一個整數不在數組中。通過輔助數組B[0,...n]來記錄A中出現的整數
(1)在O(n)時間找到缺失整數
(2)若數組中每個數值是二進制的,不能直接對每個數取出其數值,則如何找到缺失
解答:
(1)遍歷數組A,將每個出現的值存儲在B中下標對應值,之後遍歷一次B即可
eg:
for val in A:
B[val] = 1
for i in range(len(B)):
if B[i] == 0:
return i
(2)使用異或操作來處理。1^0 = 0,1^1 = 0,0^0 = 0,既:兩個相等的數異或結果爲0,而0與任何數異或得該數本身。因此,將A中的值與0~n異或,得到的結果就是缺失的整數。
6-3:
題目描述:Young 氏矩陣:從左到右遞增,從上到下遞增。
(1)插入一個新元素的算法及複雜度
(2)對n*n個數使用young氏矩陣排序的複雜度爲O(n^3)
(3)在m*n矩陣中找到一個給定數,複雜度O(m + n)
解答:
(1)在矩陣右下角插入新元素。若新元素大於上方與前方的元素,則插入成功。否則, 將新元素往小的方向比較交換過去。最壞情況的複雜度爲:走到了左上角O(n+m)
void insert(vec,i,j)
{
//此處僅提供參考思想,不具體涉及邊緣控制
curr = vec[i][j];
left = vec[i][j-1];
up = vec[i-1][j];
if(curr >= left && curr >= up)
return; //找到合適位置
else if(curr < left)
insert(v,i,j-1)
else
insert(v,i-1,j)
}
(2)對 n * n 個元素使用Young矩陣,每個元素插入該矩陣的複雜度是O(n+n),則,總的複雜度爲O(2n*n*n) = O(n^3)。對一個Y矩陣,左上角爲最小值,最左一列遞增,最頂一行遞增,則使用合併排序中的摸牌式合併方法,O(m+n)的複雜度就可以排序好第一列與第一行。同樣的方法。遍歷整個矩陣一次,就可以完成排序
(3) 從左下角起尋找元素。若當前值小於需要值,則往右;若當前值大於需要值,則往上。複雜度爲O(m + n)