在乙個 n * m 的二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個高效的函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。
示例:
[[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]
給定 target = 5,返回 true。錯誤思路:一開始是想到元素從下標為(0,0)開始遍歷,先以[0][j](n>=j>=0)遍歷,記錄第乙個出現大於target的j,然後如果有target會出現在第j-1列。再以[i][0](m>=i>=0)遍歷,記錄第乙個出現大於target的i,然後如果有target會出現在第i-1行。接下來只用尋找第j-1列元素和i-1行元素就行。但是事實上這樣做漏掉了很多情況,例如j-1的前一列,和i-1的前一行。給定 target = 20,返回 false。
如下:
[[1,3,5,7,9],如果按照我的方案,會出現i=4,j=4 ,但是在第五行和第五列沒有找到這個13,二是出現在了3行2列,所有這個方法是有問題的。[2,4,6,8,10],
[11,13,15,17,19]
,[12,14,16,18,20],
[21,22,23,24,25]]
target=13
如果把陣列旋轉逆時針45度,以下標元素(0,n)為根節點,往左變小往右變大,我們可以類似於理解為2叉搜尋樹
**這個題型的解法是一定要注意最開始元素的位置。**找到它就容易很多。
#include
#include
using
namespace std;
intmain()
int value =
0,target=5;
bool flag=
false
;for
(int i=
0;isize()
;i++)}
int len=
0,wei=matrix[0]
.size()
-1;while
(len
size()
&&wei>=0)
else
if(matrix[len]
[wei]
else
} cout<
return0;
}
這道題還有其他的解題思路:例如,二分查詢和遞迴方法,之後補充
[ ] 形狀為(0,) m.size()為0,直接false,因為不存在target形狀為(1,0) m.size() 為1 但沒有資料 不存在資料直接為false
[[1]] 形狀為(1,1)
[[1,1]] 形狀為1,2
04 二維陣列中的查詢
給定乙個二維陣列,其每一行從左到右遞增排序,從上到下也是遞增排序。給定乙個數,判斷這個數是否在該二維陣列中。consider the following matrix 1,4,7,11,15 2,5,8,12,19 3,6,9,16,22 10,13,14,17,24 18,21,23,26,30 ...
04 二維陣列中的查詢
題目 在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。public class testmethod system.out.println method ar...
04 二維陣列中的查詢
在乙個 n m 的二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。示例 現有矩陣 matrix 如下 1,4,7,11,15 2,5,8,12,19 3,6,9,16,22 10,13,1...