leetcode刷题74. 搜索二维矩阵
1.题目描述
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出: true
示例 2:
输入: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出: false
提示:
- m == matrix.length
- n == matrix[i].length
- 1 <= m, n <= 100
- -104 <= matrix[i][j], target <= 104
2.解法
2.1 暴力
2.1.1 思路
暴力法就是遍历,双循环完事。
2.1.2 Java代码
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
for(int i = 0;i<matrix.length;i++){
for(int j =0;j<matrix[0].length;j++){
if(matrix[i][j]==target){
return true;
}
}
}
return false;
}
}
2.2 贪心
2.2.1 思路
贪心算法不是把二维数组看成一维,而是看成二维的。
可以理解成棋子向右和向下走,因为是递增的,所以只需要不超过target,如果target存在就一定能走到。
2.2.2 Java代码
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int n = matrix.length -1,m = matrix[0].length -1;
int i =0, j =0;
while(true){
if(matrix[i][j]==target){
return true;
}
else if(i<n&&matrix[i+1][j]<=target){
i++;
}
else if(j<m&&matrix[i][j+1]<=target){
j++;
}
else{
return false;
}
}
}
}
2.3 二分
2.3.1 思路
二分查找其实就是把二维数组看成一整个横向的数组,然后直接二分。
其中主要将mid转化为行和列。
二分查找看不懂的看这个二分查找。
2.3.2 Java代码
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int n = matrix.length,m = matrix[0].length;
int left = 0,right = m*n-1;
while(left<=right){
int mid = (left+right)/2;
int i = mid/m;
int j = mid%m;
if(matrix[i][j]==target){
return true;
}
else if(matrix[i][j]>target){
right = mid-1;
}
else{
left = mid+1;
}
}
return false;
}
}