【分析】
現在一看到題,第一反應,暴力求解。雖然不用費腦子,但是時間複雜度高啊。
這道在二維數組中查找目標值的題,也可以暴力查找,複雜度O(mn)。但是,這樣題目給定的"每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序"就毫無用處了。
所以,還是要動動小腦袋。
根據題目給定的條件,數組中的值沿主對角線方增大,如圖所示:
對於(i,j)位置的元素來講,左上都比它小,右下都比它大。這就提供了一個思路,從右上角開始查找目標值,根據目標值的大小向左向下移動。如果目標值大,往下找;如果目標值小,往左找。
【示例】
給定目標值5:
給定目標值20:
【代碼】
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if(matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return false;
}
int n = matrix.length, m = matrix[0].length;
int row = 0, col = m-1;
while(row<n && col>=0){
int num = matrix[row][col];
if(num == target){
return true;
} else if(num > target){
col--;
} else{
row++;
}
}
return false;
}
}