此題為leetcode分類「劍指offer」中第二題,本人僅使用了最簡單的暴力法,在沒有思路的情況下,毫不猶豫的去檢視了官方答案,所以以下的兩種方式均為官方解題題目:
在乙個 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。
限制:0 <= n <= 1000
0 <= m <= 1000
方法一:暴力
思路:如果不考慮二維陣列排好序的特點,則直接遍歷整個二維陣列的每乙個元素,判斷目標值是否在二維陣列中存在。
依次遍歷二維陣列的每一行和每一列。如果找到乙個元素等於目標值,則返回 true。如果遍歷完畢仍未找到等於目標值的元素,則返回 false。
class solution
int rows = matrix.length, columns = matrix[0].length;
for (int i = 0; i < rows; i++) }}
return false;
}}
複雜度分析:
方法二:線性查詢
思路:由於給定的二維陣列具備每行從左到右遞增以及每列從上到下遞增的特點,當訪問到乙個元素時,可以排除陣列中的部分元素。
從二維陣列的右上角開始查詢。如果當前元素等於目標值,則返回 true。如果當前元素大於目標值,則移到左邊一列。如果當前元素小於目標值,則移到下邊一行。
可以證明這種方法不會錯過目標值。如果當前元素大於目標值,說明當前元素的下邊的所有元素都一定大於目標值,因此往下查詢不可能找到目標值,往左查詢可能找到目標值。如果當前元素小於目標值,說明當前元素的左邊的所有元素都一定小於目標值,因此往左查詢不可能找到目標值,往下查詢可能找到目標值。
class solution
int rows = matrix.length, columns = matrix[0].length;
int row = 0, column = columns - 1;
while (row < rows && column >= 0) else if (num > target) else
}return false;
}}
複雜度分析: 二維陣列中查詢
1.問題描述 在乙個二維陣列中,每一行按照從左到右的遞增順序排序,每一列按照從上到下的遞增的順序排序,請完成這樣乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列是否含有該整數。來自 劍指offer 2.分析 首先選取陣列中右上角的數字。如果該數字等於要查詢的數字,查詢過程結束 如果該數字大於要查...
二維陣列中查詢
乙個二維陣列,每一行從左到右,每一列從上到下,都是按遞增順序排列,輸入乙個二維陣列和某個數,判斷陣列中是否存在這個數 排除行和列 比如從右上角元素出發。先確定列的範圍,如果查詢數大於當前列的第一行數,那麼這一行的所有數都大於查詢數,排除,繼續查詢左邊列 確定行範圍,在前面列的範圍內,如果最右邊元素小...
二維陣列中查詢
題目描述 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。思路解析 這是一道比較基礎的題,就是找二維陣列中的乙個數。方案一 暴力 function find target,array...