演算法刷題筆記 二維陣列中的查詢

2021-10-21 00:19:35 字數 2123 閱讀 5081

題目描述

解法一:二叉搜尋樹

解法構思:

類似於二叉樹的,若查詢失敗,則一定終止於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,如果按照常規的查詢...