// 面試題4:二維陣列中的查詢
// 題目:在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按
// 照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個
// 整數,判斷陣列中是否含有該整數。
例如乙個陣列:
// 1 2 8 9
// 2 4 9 12
// 4 7 10 13
// 6 8 11 15
查詢7會返回true,查詢5會返回false
1、從第乙個元素開始慢慢比較,把所有元素全比較一遍,這是最笨的方法。
2、還可以縮小範圍,不必比較每個元素。
如果選取的元素大於目標數字,說明目標在元素的左方和上方。
如果選取的元素小於目標數字,說明目標在元素的右方和下方。
然後怎麼辦呢,將陰影部分的全部比較?
這樣確實是比第一種方法高明了一點點,但是思路還是很複雜,應該不能這麼做。
3、書裡提供了一種思路,嘗試選取右上角的元素來和目標數字比較。
比如選取右上角元素查詢7。
選取右上角的元素9,顯然9>7,9所在的第3列都大於7,剔除第3列。
再次選取右上角元素8,顯然8>7,8所在的第2列都大於7,剔除第2列。
再次選取右上角的元素2,顯然2<7,2所在的第0行都小於7(只剩下1和2),剔除第0行。
再次選取右上角的元素4,顯然4<7,4所在的第1行都小於7(只剩下2和4),剔除第1行。
再次選取右上角的元素7,顯然7=7,查詢結束,返回。
再比如選取右上角元素查詢5.
選取右上角的元素9,顯然9>5,9所在的第3列都大於5,剔除第3列。
選取右上角的元素8,顯然8>5,8所在的第2列都大於5,剔除第2列。
選取右上角的元素2,顯然2>5,2所在的第0行都小於於5(1和2),剔除第0行。
選取右上角的元素4,顯然4<5,4所在的第1行都小於5(2和4),剔除第1行。
選取右上角的元素7,顯然7>5,7所在的第1列都大於5(7和8),剔除第1列。
選取右上角的元素4,顯然4<5,4所在的第2行都小於5(4),剔除第2行。
選取最後乙個元素6,未查找到5,返回。
4、其實還可以選取左下角的元素來不斷縮小範圍,目前只寫了**,具體過程明天再寫。
5、但是選取左上角和右下角的元素,你是沒辦法縮小範圍的,只能確定選定的元素和目標數字的大小,沒辦法去掉整行或者整列,其實就是第1種方法的變形,效率很低,沒有什麼用處。。
選取右上角元素:
if選取左下角元素:(引數輸入合法)
else
if(選取元素》目標數字)
去掉目標元素所在列;
else
去掉目標元素所在行;
}return
false
;}
if選取右上角元素:(引數輸入合法)
else
if(選取元素目標數字)
去掉目標元素所在列;
else
去掉目標元素所在行;
}return
false
;}
bool find(int* matrix, int rows, int coloums, int選取左下角元素:number)
//選取元素》目標數字,去掉選取元素所在列
else
if (matrix[row*coloums + coloum] >number)
coloum--;
////選取元素
《目標數字,去掉選取元素所在行
else
row++;}}
return
found;
}
bool find(int* matrix, int rows, int coloums, intnumber)
//選取元素》目標數字,去掉選取元素所在列
else
if (matrix[row*coloums + coloum]
coloum++;
//選取元素《目標數字,去掉選取元素所在行
else
row--;}}
return
found;
}
面試題4 二維陣列中的查詢
題目 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。bool find int matrix,int cols,int rows,int target bool find int ...
面試題4 二維陣列中的查詢
題目 二維陣列中的查詢 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按 照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個 整數,判斷陣列中是否含有該整數。include bool find int matrix,int rows,int columns,int...
面試題4 二維陣列中的查詢
題目 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下的遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。c 實現 includeusing namespace std bool find int numbers,int rows,...