您的位置:首页 > 其它

Search a 2D Matrix

2015-07-16 16:42 381 查看
题目:

Writeanefficientalgorithmthatsearchesforavalueinanmxnmatrix.Thismatrixhasthefollowingproperties:

Integersineachrowaresortedfromlefttoright.

Thefirstintegerofeachrowisgreaterthanthelastintegerofthepreviousrow.

Forexample,

Considerthefollowingmatrix:

[
[1,3,5,7],
[10,11,16,20],
[23,30,34,50]
]

Giventarget=
3
,return
true
.

解题思路:利用两次二分查找法。因为所给矩阵第一列也是升序排列的,所以可以先对第一列进行二分查找,锁定该元素所在行数,然后再对列进行二分查找,即可判断target是否存在。这个的算法时间复杂度是O(log(rows)+log(columns))。

代码

/**
*本代码由九章算法编辑提供。没有版权欢迎转发。
*-九章算法致力于帮助更多中国人找到好的工作,教师团队均来自硅谷和国内的一线大公司在职工程师。
*-现有的面试培训课程包括:九章算法班,系统设计班,BAT国内班
*-更多详情请见官方网站:http://www.jiuzhang.com/
*/

//BinarySearchTwice
publicclassSolution{
publicbooleansearchMatrix(int[][]matrix,inttarget){
if(matrix==null||matrix.length==0){
returnfalse;
}
if(matrix[0]==null||matrix[0].length==0){
returnfalse;
}

introw=matrix.length;
intcolumn=matrix[0].length;

//findtherowindex,thelastnumber<=target
intstart=0,end=row-1;
while(start+1<end){
intmid=start+(end-start)/2;
if(matrix[mid][0]==target){
returntrue;
}elseif(matrix[mid][0]<target){
start=mid;
}else{
end=mid;
}
}
if(matrix[end][0]<=target){
row=end;
}elseif(matrix[start][0]<=target){
row=start;
}else{
returnfalse;
}

//findthecolumnindex,thenumberequaltotarget
start=0;
end=column-1;
while(start+1<end){
intmid=start+(end-start)/2;
if(matrix[row][mid]==target){
returntrue;
}elseif(matrix[row][mid]<target){
start=mid;
}else{
end=mid;
}
}
if(matrix[row][start]==target){
returntrue;
}elseif(matrix[row][end]==target){
returntrue;
}
returnfalse;
}
}

//BinarySearchOnce
publicclassSolution{
publicbooleansearchMatrix(int[][]matrix,inttarget){
if(matrix==null||matrix.length==0){
returnfalse;
}
if(matrix[0]==null||matrix[0].length==0){
returnfalse;
}

introw=matrix.length,column=matrix[0].length;
intstart=0,end=row*column-1;

while(start+1<end){
intmid=start+(end-start)/2;
intnumber=matrix[mid/column][mid%column];
if(number==target){
returntrue;
}elseif(number<target){
start=mid;
}else{
end=mid;
}
}

if(matrix[start/column][start%column]==target){
returntrue;
}elseif(matrix[end/column][end%column]==target){
returntrue;
}

returnfalse;
}
}



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