在乙個 n * m 的二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。
示例:
現有矩陣 matrix 如下:
[1, 4, 7, 11, 15],給定 target = 5,返回 true。[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
給定 target = 20,返回 false。
限制:
暴力求解
當然最容易想到的是暴力求解,就是乙個個查詢,如果找到就返回true,沒找到就返回false,**很簡單,沒什麼可說的。
public
boolean
findnumberin2darray
(int
matrix,
int target)
int rows = matrix.length, columns = matrix[0]
.length;
for(
int i =
0; i < rows; i++)}
}return
false
;}
線性查詢題中說了每行都是遞增的,每列也是遞增的。所以我們查詢的時候可以利用這個特性,如果我們從左上角開始找,當目標值target大於當前值的時候,我們需要往更大的找,但這個時候無論往右找還是往下找都是比當前值大,所以我們無法確定該往哪個方向找。同理右下角也一樣,所以我們只能從右上角或者左下角開始找。我們就用上面的資料當target等於23的時候從右上角開始找,來畫個圖看一下
從右上角開始找有個方便的地方就是他左邊的都是比他小的,他下邊的都是比他大的,如果target大於當前值我們就往下邊找,如果target小於當前值我們就往左邊找,來看下**。
public
boolean
findnumberin2darray
(int
matrix,
int target)
int rows = matrix.length, col = matrix[0]
.length;
//從第0行col - 1列開始查詢,也就是第1行最後一列的那個數字開始
int row =0;
int column = col -1;
while
(row < rows && column >=0)
else
if(num > target)
else
}return
false
;}
當然從左下角查詢也是可以的,因為左下角右邊的值是比他大的,上邊的值是比他小的,也能區分,**和上面差不多,來看下
public
boolean
findnumberin2darray
(int
matrix,
int target)
int rows = matrix.length, col = matrix[0]
.length;
int row = rows -1;
int column =0;
while
(row >=
0&& column < col)
else
if(num > target)
else
}return
false
;}
總結這題說了行和列都是遞增的,所以我們可以根據這個特性來查詢,只有從右上角或左下角查詢的時候才能確定下一步該往哪個方向走,從左上角或右下角都沒法確定。
劍指offer 二維陣列
題目 在乙個二維陣列中每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。完成乙個函式,輸入這樣的陣列和乙個整數,判斷陣列中是否含有該整數。思路 由於該二維陣列從左到右,從上到下均為順序遞增的。因此右下角與左上角的數字均大於或小於其周圍數字,如果選擇改組作為起始點,則無法確定下一...
劍指offer 二維陣列中查詢
在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和一 個整數,判斷陣列中是否含有該整數。public class solution 因為陣列每一行都按照從左到右遞增的順序排序,每一列都按照從上到下...
劍指offer 二維陣列中查詢
從今天開始每天一題,除了節假日。在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。class solution return false class solut...