/*
* 240.Search in a 2D Matrix II
* 2016-6-17by Mingyang
* From left-bottom to right-top
* 他这道题目虽说是用了BS,但是并不一定要有mid,这里就从最左下角到右上角
* 这个数大于同一列的,小于同一行的,只要跟target比较以后,就可以要么删除一列,要么删除一行--------找拐点
* 这个题目自己做的时候给出了一个nlog的方案,先是row从下往上走,在同一row里面再继续bs
* 但是这个题目的好方法就是从左下角出发,要么往右走,要么往上走
* 如果比目标大,表示我这一行都比目标大,那么我就往上走一个
* 如果比目标小,这一列都比目标小,那么往右走一个
*/
public boolean searchMatrix2(int[][] matrix, int target) {
if (null == matrix || matrix.length == 0) {
return false;
}
int row = matrix.length - 1;
int col = 0;
while (row >= 0 && col < matrix[0].length) {
if (matrix[row][col] == target) {
return true;
} else if (matrix[row][col] < target) {
col++;
} else {
row--;
}
}
return false;
}
/*
* 用了DC思想,就是根据与中间的大小,来舍弃一个部分的值
* Divide-Conquer,Based on the mid of the matrix, divide the whole matrix into four parts: left-top, left-bottom, right-top, right-bottom
* If the mid is smaller than target, abandon the left-top area, recursion from the other three areas.
* If the mid is larger than target, abandon the right-bottom area, recursion from the other three ares.
* Time Complexity formula:T(n) = 3T(n/2) + c
*/
public boolean searchMatrixImprove(int[][] matrix, int target) {
if (null == matrix || matrix.length == 0) {
return false;
}
return helper(matrix, 0, matrix.length - 1, 0, matrix[0].length - 1, target);
}
private boolean helper(int[][] matrix, int rowStart, int rowEnd, int colStart, int colEnd, int target) {
if (rowStart > rowEnd || colStart > colEnd) {
return false;
}
int rowMid = rowStart + (rowEnd - rowStart) / 2;
int colMid = colStart + (colEnd - colStart) / 2;
if (matrix[rowMid][colMid] == target) {
return true;
} else if (matrix[rowMid][colMid] > target) {
return helper(matrix, rowStart, rowMid - 1, colStart, colMid - 1, target) ||
helper(matrix, rowMid, rowEnd, colStart, colMid - 1, target) ||
helper(matrix, rowStart, rowMid - 1, colMid, colEnd, target);
} else {
return helper(matrix, rowMid + 1, rowEnd, colMid + 1, colEnd, target) ||
helper(matrix, rowMid + 1, rowEnd, colStart, colMid, target) ||
helper(matrix, rowStart, rowMid, colMid + 1, colEnd, target);
}
}

最新文章

  1. 设计模式之六大原则——迪米特法则(LoD,LKP)
  2. ACE - Reactor模式源码剖析及具体实现(大量源码慎入)
  3. 9)Java内部类(Inner Class)
  4. 解决Flash和html在多标签浏览器中互访问题
  5. php empty()和isset()的区别&lt;转载&gt;
  6. 用shell查找某个目录下最大文件
  7. sed写的命令收集
  8. Android 模拟HTTP协议的编码问题 Android默认编码UTF-8
  9. ubuntu server 11.10 安装 oracle 10g XE
  10. Ubuntu重装mysql错误解决
  11. Android 开发TCP协议时,报错NetworkOnMainThreadException
  12. 深入理解Spring Redis的使用 (八)、Spring Redis实现 注解 自动缓存
  13. springdata 动态查询 是用来查询的 仅提供查询功能
  14. mysql 原理 ~ 索引通说
  15. auth模块(登录验证)
  16. session token两种登陆方式
  17. u-boot移植(一)---准备工作
  18. Regex实例
  19. 基于Centos体验自然语言处理 by PHP SDK
  20. Yocto学习笔记

热门文章

  1. 洛谷 P1803 凌乱的yyy
  2. Android(java)学习笔记161:开发一个多界面的应用程序之人品计算器的简单实现
  3. mysql 增删查改
  4. 多表单异步验证 可以用 Promise validate
  5. JetBrains系列产品激活
  6. 让idea调试不进入class文件中去
  7. ES搭建
  8. virsh 命令
  9. 【EL&amp;JSTL】学习笔记
  10. webpack之source map