题目:
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
- Integers in each row are sorted from left to right.
- The first integer of each row is greater than the last integer of the previous row.
For example,
Consider the following matrix:
[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
Given target = 3
, return true
.
给定一个m * n的矩阵,然后给定一个需要判断是否在这个矩阵中的值,其中这个矩阵有如下特点,每一行都是已经排好序的,并且每一行的第一个元素都比下一行的第一个元素要小,判断给定的这个值是否在这个矩阵中。
我的思路是这样的,首先是按行找,找到需要找的那个值在一行,其中这里需要考虑好几种情况,首先是如果这个矩阵只有一行,并且这个值比第一行的第一个元素都要小,那么就直接返回false;如果这个值找到的行在最后一行,那么直接就返回这一行的行号即可。找到具体在哪一行之后,就可以调用二分搜索来查找具体这个值是否存在。
代码:
<span style="font-size:14px;">public class Solution
{
public boolean searchMatrix(int[][] matrix,int target)
{
int rowlength = matrix.length;
System.out.println(rowlength);
int collength = matrix[0].length;
int flag = -1;
for(int i = 0; i < rowlength; i++)
{
if(matrix[i][0] == target)
return true;
if(matrix[i][0] > target && i == 0)
return false;
if(i < rowlength - 1 && matrix[i][0] < target && matrix[i + 1][0] > target)
{
flag = i;
break;
}
if(matrix[i][0] <target && i == rowlength - 1)
{
flag = i;
break;
}
}
System.out.println(flag);
if(flag != -1)
{
return binarySearch(matrix[flag],0,collength - 1,target);
}
return false;
}
public boolean binarySearch(int[] nums,int start,int end,int target)
{
if(start <= end)
{
int middle = (start + end) / 2;
int middleValue = nums[middle];
if(target == middleValue)
return true;
else if(target < middleValue)
return binarySearch(nums,start,middle - 1,target);
else if(target > middleValue)
return binarySearch(nums,middle + 1,end,target);
}
return false;
}
}</span>