目录
题目描述:
思路:
代码:
题目描述:
给你一个满足下述两条属性的 m x n 整数矩阵:
每行中的整数从左到右按非严格递增顺序排列。
每行的第一个整数大于前一行的最后一个整数。
给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。
示例 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
思路:
最简单的解决方案就是暴力搜索,我们可以将二维矩阵遍历一遍,最后如果找到就返回true,否则就返回false。基于暴力解法,可以进一步做一下优化,就是根据题目可以知道,二维数组中的每个数字的首元素的特征,我们就能判断一下当前target是否在当前数组和下一个数组的首元素之间来判断是否进行下一步遍历。以此来减少不必要的比较。
最好的优化就是在搜索的时候进行二分查找。
代码:
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix.length==1){
return Arrays.binarySearch(matrix[0], target)>=0;
}
for(int i=0;i<matrix.length-1;i++){
if(matrix[i][0]<target && matrix[i+1][0]>target){
int n = Arrays.binarySearch(matrix[i], target);
if(n<0){
return false;
}else{
return true;
}
}
if(matrix[i][0]==target || matrix[i+1][0]==target){
return true;
}
}
int n = Arrays.binarySearch(matrix[matrix.length-1], target);
if(n<0){
return false;
}else{
return true;
}
}
}