题目描述:
思路解析:此题容易想到的有两种思路。1)暴力法。遍历数组,然后进行比较,直到找到目标数。暴力时间复杂度为O(nm),即为二维数组的大小。2)线性查找。由题目可知,数组按照一定的顺序排列,可以联想到,对行和列进行判断,然后排除,直到找到目标数。以题目中的矩阵为例(5行5列),从数组的右上角开始判断,即第0行、第4列。如果matrix[0][4]==target,则返回true;如果matrix[0][4]<target,则说明target一定在第1-4行,进行行数的++操作,因为最后一列的数字均大于前几列,第一行的数字均小于后几行;同理,如果matrix[0][4]>target,则说明target一定在第0-3列,进行列数的–操作。依次循环进行判断,直到matrix[0][4]==target,如果没有找到,则返回false。
代码实现:
class Solution { public boolean findNumberIn2DArray(int[][] matrix, int target) { //方法一:暴力 时间复杂度 O(nm),即为二维数组的大小 if(matrix == null || matrix.length == 0 || matrix[0].length == 0){ return false; } //行 int row = matrix.length; //列 int column = matrix[0].length; //暴力遍历 for(int i = 0;i<row;i++){ for(int j =0;j<column;j++){ if(matrix[i][j] == target){ return true; } } } return false; //方法二:线性查找 时间复杂度 O(n+m) if(matrix == null || matrix.length <= 0 || matrix[0].length <= 0){ return false; } int rows = matrix.length; //行 int columns = matrix[0].length; //列 //从右上角开始判断,即0行最后一列 int row = 0; int column = columns-1; while(row < rows && column >= 0){ if(matrix[row][column] == target){ return true; }else if(matrix[row][column] > target){ //列数-1 column--; }else{ //行数+1,进入下一行 row++; } } return false; } } 分享: 在解决编程问题时的一个重要思想或方法:先进行简单的尝试,通过简单的尝试,找出规律,再进行代码的编写。