• 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;
        }
    };
    
  • 相关阅读:
    MySQL++:MySQL 复合索引、普通索引总结
    AutoCAD 二次开发之python(学习中)
    APScheduler 学习笔记
    pylint 定制化配置/使用 -待整理
    JDK和CGLIB动态代理区别
    Java 类加载过程
    判断字符串是否是数字类型
    Java 并发编程锁工具
    花式写挂
    WC2021 题目清单
  • 原文地址:https://www.cnblogs.com/libaoquan/p/7009981.html
Copyright © 2020-2023  润新知