Search a 2D Matrix
2015-07-16 16:42
381 查看
题目:
Writeanefficientalgorithmthatsearchesforavalueinanmxnmatrix.Thismatrixhasthefollowingproperties:
Integersineachrowaresortedfromlefttoright.
Thefirstintegerofeachrowisgreaterthanthelastintegerofthepreviousrow.
Forexample,
Considerthefollowingmatrix:
Giventarget=
解题思路:利用两次二分查找法。因为所给矩阵第一列也是升序排列的,所以可以先对第一列进行二分查找,锁定该元素所在行数,然后再对列进行二分查找,即可判断target是否存在。这个的算法时间复杂度是O(log(rows)+log(columns))。
代码:
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; } }
相关文章推荐
- 【Hibernate一】概述及入门
- Cordova 8 架构使用sqlite
- Form开发中组件控制的几个常用方法
- STM32启动文件深度解析
- LeetCode(16) 3Sum Closest
- cocos2d-x初探学习笔记(24)--音乐音效
- 公积金买房有什么好处?
- SpringMVC与Struts2的对比
- 地球坐标转换成火星坐标的代码
- [LintCode]unique paths with obstacles
- HTML 中有用的字符实体
- PHP数组函数的分组归纳
- Android开发UI之给ListView设置布局动画效果
- 黑马程序员_多线程
- iReport中顺序序列的分组问题
- Linux系统中关闭root登录的方法
- libxml2的安装和使用
- ZooKeeper
- 慎用TCP的选项SO_LINGER
- Android 屏幕适配方案