lintcode-28-搜索二维矩阵

搜索二维矩阵

写出一个高效的算法来搜索 m × n矩阵中的值。
这个矩阵具有以下特性:
每行中的整数从左到右是排序的。
每行的第一个数大于上一行的最后一个整数。

样例

考虑下列矩阵:
[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
给出 target = 3,返回 true

挑战

O(log(n) + log(m)) 时间复杂度

标签

二分法 雅虎 矩阵

思路

采用二分查找,先二分查找target所在行,在二分查找所在列

code

class Solution {
public:
    /**
     * @param matrix, a list of lists of integers
     * @param target, an integer
     * @return a boolean, indicate whether matrix contains target
     */
    bool searchMatrix(vector<vector<int> > &matrix, int target) {
        // write your code here
        int rowSize = matrix.size();
        if(rowSize < 1)
            return false;
        int colSize = matrix[0].size();
        if(target < matrix[0][0] || target > matrix[rowSize-1][colSize-1])
            return false;

        int rowIndex = 0, colIndex = 0;

        int rowHigh = rowSize-1, rowLow = 0, rowMid = (rowHigh + rowLow) / 2;
        while(rowLow <= rowHigh) {
            if(matrix[rowMid][0] == target || matrix[rowMid][colSize-1] == target) {
                return true;
            }
            else if(matrix[rowMid][0] < target && matrix[rowMid][colSize-1] > target) {
                rowIndex = rowMid;
                break;
            }
            else if(matrix[rowMid][0] > target) {
                rowHigh = rowMid - 1;
                rowMid = (rowHigh + rowLow) / 2;
            }
            else if(matrix[rowMid][colSize-1] < target){
                rowLow = rowMid + 1;
                rowMid = (rowHigh + rowLow) / 2;
            }
        }

        int colHigh = colSize-1, colLow = 0, colMid = (colHigh + colLow) / 2;
        while(colLow <= colHigh) {
            if(matrix[rowIndex][colMid] == target) {
                return true;
            }
            else if(matrix[rowIndex][colMid] < target) {
                colLow = colMid + 1;
                colMid = (colHigh + colLow) / 2;
            }
            else {
                colHigh = colMid - 1;
                colMid = (colHigh + colLow) / 2;
            }
        }
        return false;
    }
};
posted @   LiBaoquan  阅读(1575)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 上周热点回顾(1.20-1.26)
· 【译】.NET 升级助手现在支持升级到集中式包管理
点击右上角即可分享
微信分享提示