題目來源:牛客網-劍指Offer專題
題目地址:二維數組中的查找
題目描述
在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
題目解析
方法一:
暴力法,遍歷二維數組,時間複雜度爲
public class Solution {
public boolean Find(int target, int [][] array) {
for (int i = 0; i < array.length; i++){
for (int j = 0; j < array[i].length; j++) {
if (array[i][j] == target)
return true;
}
}
return false;
}
}
方法二:
根據題目信息可以知道,每一行的數字都是有序的。於是,我們對每一行都進行二分查找,時間複雜度
public class Solution {
public boolean Find(int target, int [][] array) {
for (int i = 0; i < array.length; i++){
//注意搜索的邊界
int left = 0, right = array[i].length - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (array[i][mid] > target) {
right = mid - 1;
} else if (array[i][mid] < target) {
left = mid + 1;
} else {
return true;
}
}
}
return false;
}
}
方法三:
由於在數組在水平和垂直方向都是遞增的,所以我們可以從左下角開始,若當前值 比目標值 大,則向上移動;若 ,則向右移動。以這種方法去搜尋目標值,時間複雜度
public class Solution {
public boolean Find(int target, int [][] array) {
int row = array.length - 1, col = 0;
while (row >= 0 && col < array[row].length) {
if (array[row][col] > target) {
row--;
} else if (array[row][col] < target) {
col++;
} else {
return true;
}
}
return false;
}
}
如果本文對你有所幫助,別忘了點贊哦~