博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode]74. Search a 2D Matrix
阅读量:2787 次
发布时间:2019-05-13

本文共 2438 字,大约阅读时间需要 8 分钟。

解法一:看成一个sorted一维数组

public class Solution {    public boolean searchMatrix(int[][] matrix, int target) {        if (matrix == null || matrix.length == 0) {            return false;        }        int row = matrix.length;        int col = matrix[0].length;        int beg = 0;        int end = row * col - 1;        while (beg < end) {            int mid = beg + (end - beg) / 2;            int tmp = matrix[mid / col][mid % col];            if (tmp == target) {                return true;            } else if (tmp > target) {                end = mid;            } else {                beg = mid + 1;            }        }        return matrix[end / col][end % col] == target;    }}

解法二:从右上角二分,这样code比较复杂,但是局部访问原理不好,可能一直访问列

public class Solution {    public boolean searchMatrix(int[][] matrix, int target) {        if (matrix == null || matrix.length == 0) {            return false;        }        int row = 0;        int col = matrix[0].length - 1;        while (row < matrix.length && col >= 0) {            if (matrix[row][col] == target) {                return true;            } else if (matrix[row][col] > target) {                int index = hSearch(matrix, row, target);                if (index < matrix[0].length && matrix[row][index] == target) {                    return true;                }                if (col == index) {                    return false;                }                col = index;            } else {                int index = vSearch(matrix, col, row, target);                if (index < matrix.length && matrix[index][col] == target) {                    return true;                }                if (row == index) {                    return false;                }                row = index;            }        }        return false;    }    private int hSearch(int[][] matrix, int pos, int target) {        int index = Arrays.binarySearch(matrix[pos], target);        return index >= 0 ? index : -(index + 1);    }    private int vSearch(int[][] matrix, int pos, int beg, int target) {        int end = matrix.length - 1;        while (beg < end) {            int mid = beg + (end - beg) / 2;            if (matrix[mid][pos] == target) {                return mid;            } else if (matrix[mid][pos] > target) {                end = mid - 1;            } else {                beg = mid + 1;            }        }        return matrix[beg][pos] >= target ? beg : beg + 1;    }}

转载地址:http://uvhld.baihongyu.com/

你可能感兴趣的文章
如何合理的设计代码分层,论代码分层的设计之道
查看>>
状态机设计
查看>>
ArrayList集合实现RandomAccess接口有何作用?为何LinkedList集合却没实现这接口?
查看>>
JAVA不可变类(immutable)机制与String的不可变性
查看>>
Java多线程编程之不可变对象模式
查看>>
Java 容器 & 泛型:六、容器讲到为什么要使用泛型
查看>>
java IO流学习总结
查看>>
Java 核心
查看>>
容器加载因子和扩容因子
查看>>
前端开发者必备的Nginx知识
查看>>
理解Nginx中Server和Location的匹配逻辑
查看>>
spring boot 全局异常处理的实现(@ExceptionHandler),以及@InitBinder、@ModelAttribute的作用
查看>>
聊聊 TCP 长连接和心跳那些事
查看>>
偏向锁,轻量级锁与重量级锁的区别与膨胀
查看>>
微服务接口限流的设计与思考(附GitHub框架源码)
查看>>
Java面试官最喜欢问的关键字-volatile
查看>>
mysql事务、redo日志、undo日志、checkpoint详解
查看>>
最终一致性 可靠消息投递的方案
查看>>
https://mp.weixin.qq.com/s/zRBH6SJjRqBiZSmK6fREUw
查看>>
教你一些IDE中比较骚的操作技巧!
查看>>