406,劍指 Offer 二維陣列中的查詢

2021-10-09 16:07:03 字數 2198 閱讀 9286

在乙個 n * m 的二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。

示例:

現有矩陣 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]

給定 target = 5,返回 true。

給定 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...