題目描述
解法一:二叉搜尋樹
解法構思:
類似於二叉樹的,若查詢失敗,則一定終止於nil區。比如,在根為13的樹中查詢12,如下圖。
上手程式設計:
inline tupleleft(const tuple& root) ;
}inline tupleright(const tuple& root) ;
}class solution ;
// 獲取傳入根的值
auto getvalue = [&matrix] (const tuple& root) ;
auto root = tuple;
while (1) }}
class solution
return false;}}
解法二:二分搜尋,遞迴查詢,減而治之
解法構思:
經過這樣的查詢,我們將區域從(1, 1)-> (n, m) 縮小到了(r, 1) -> (n, c - 1)
在(r, 1) -> (n, c - 1) 裡遞迴搜尋目標值
最終矩形區域會退化成3種情況(即遞迴基) :
下圖是查詢13的過程:
上手程式設計:
// 第c列的比較器的生成器
// 只能用於lower_bound, 因為lower_bound裡只會像comp(*iter, val)呼叫,
// 但是binary_search除此之外還會這樣呼叫comp(val, *iter)
auto g_2drowcomparatorcreator = (int c) ;
};class solution
bool findnumberin2darray(
vector>& matrix, int startr, int endr, int startc, int endc, int target)
// one col
if (startc + 1 == endc)
const auto col_begin = matrix.begin() + startr;
const auto row_begin = (col_begin)->begin() + startc;
// find in row-startr
auto iter_findinrow = lower_bound(row_begin, row_begin + endc - startc, target);
if (row_begin + endc - startc != iter_findinrow && *iter_findinrow == target)
return true;
if (iter_findinrow == row_begin) return false;
endc = iter_findinrow - (row_begin - startc);
// find in col
auto iter_findincol = lower_bound(
col_begin, col_begin + endr - startr, target, g_2drowcomparatorcreator(endc - 1));
if (col_begin + endr - startr != iter_findincol &&
(*iter_findincol)[endc - 1] == target)
return true;
if (iter_findincol == col_begin) return false;
startr = iter_findincol - (col_begin - startr);
// 遞迴呼叫
return findnumberin2darray(matrix, startr, endr, startc, endc, target);}};
效率比較 刷題 二維陣列查詢
在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。package timufuxi public class kaoshi boolean symbol sol...
刷題筆記 二維陣列中的查詢(C )
在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。由於每行每列均漸漸增大。將搜尋範圍設定為乙個矩形,將矩形右上角的值與target進行比較。將矩形右上角的值與t...
刷演算法 二維陣列中的查詢
在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。例如二維陣列arr 1,2,3,4 5,6,7,8 9,10,11,12 target 7,如果按照常規的查詢...