1.題目描述
2.思路
方法一:
定義其實坐標,右上角的元素(0,n-1)。進入while循環(注意邊界條件,行數小于m,列數要>=0)從右上角開始開始向左遍歷(比當前元素target小的元素),向下遍歷(比當前元素target大的元素),如果while循環結束都沒找到,返回false。
方法二:二分查找
若將矩陣每一行拼接在上一行的末尾,則會得到一個升序數組,我們可以在該數組上二分找到目標元素。可以二分升序數組的下標,將其映射到原矩陣的行和列上。
row = mid / 列數,表示這是第幾行;
col = mid % 列數,表示這是該行中的第幾個元素。
3.代碼實現
方法一:
class Solution {public boolean searchMatrix(int[][] matrix, int target) {int m = matrix.length;int n = matrix[0].length;int row = 0;int col = n - 1; // 從右上角開始while (row < m && col >= 0) {if (matrix[row][col] == target) {return true;} else if (matrix[row][col] > target) {col--; // 往左走} else {row++; // 往下走}}return false;}
}
方法二:
public class H74 {public boolean searchMatrix(int[][] matrix, int target) {//二維矩陣“虛擬成一維數組”進行二分查找//行數int m= matrix.length;//列數int n=matrix[0].length;//將矩陣展平成一維數組的容量int left=0;int right=m*n-1;while(left<=right){int mid=left+(right-left)/2;//防止整數溢出//將二維矩陣映射成一維數組//當前mid索引對應在矩陣的位置:當前元素的行數=mid/列數. // 將一維下標映射回二維坐標int row=mid/n;//當前元素的列數=mid/列數int col=mid%n;if(matrix[row][col]==target){return true;}else if(target>matrix[row][col]){left=mid+1;}else {right=mid-1;}}return false;}public static void main(String[] args){H74 ms=new H74();int[][] matrix={{1,3,5,7},{10,11,16,20},{23,30,34,60}};int target=11;Boolean res=ms.searchMatrix(matrix,target);System.out.print(res);}
}