您的位置:首页 > 其它

LeetCode Search a 2D Matrix

2015-12-26 13:31 344 查看
题目:

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: