前言
这道题目只需要一些简单的java语法知识,就可以看懂。
题目
leetcode-240 在二维数组中搜索一个数Ⅱ
分类(tag):二分查找这一类
英文链接:
https://leetcode.com/problems/search-a-2d-matrix-ii/
中文链接:
https://leetcode-cn.com/problems/search-a-2d-matrix-ii/
题目详述
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:
示例:
现有矩阵 matrix 如下:
[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]
给定 target = 5
,返回 true
。
给定 target = 20
,返回 false
。
昨天的题目:每天一道leetcode-74 在二维数组中搜索n
这道题和昨天的那道题不同地方是昨天的那道题每行的·最末尾的数字必然小于下一行的开头的数字,今天这个题目每行的·最末尾的数字与下一行的开头的数字没有必然的联系
题目详解
第一种方法
思路
代码
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix.length == 0)
return false;
int rowIndex = 0;//代表下标
int colIndex = matrix[0].length - 1;//代表下标
while(rowIndex < matrix.length && colIndex >=0)
{
if(target == matrix[rowIndex][colIndex])
return true;
else if(target > matrix[rowIndex][colIndex])
rowIndex++;
else
colIndex--;
}
return false;
}
}
代码11到12行就是思路中第一步的体现,13-14行就是思路中第二步的体现。
第二种方法
思路
代码
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix.length == 0 || matrix[0].length == 0)
return false;
int begin = 0;
int end = matrix.length - 1;
int midRow = (begin + end) / 2;
while(begin <= end)
{
midRow = begin + (end - begin) / 2;
if(target == matrix[midRow][0])
return true;
else if(target > matrix[midRow][0])
begin = midRow + 1;
else
end = midRow - 1;
}
for(int i=0;i<=midRow;i++)
{
int left = 0;
int right = matrix[0].length-1;
while(left <= right)
{
int mid = left + (right-left)/2;
if(matrix[i][mid] == target)
return true;
else if(matrix[i][mid] < target)
left = mid + 1;
else
right = mid - 1;
}
}
return false;
}
}
结果展示
7ms是剑指offer的方法,8m是二分查找的方法;
结束语
每天一刷leetcode,10.29号打卡~
END