zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    
  • 相关阅读:
    完美世界经典版本881外挂
    ShowModal 动态创建窗体和释放窗体
    HTML 颜色代码大全
    padding margin border 的四值顺序
    三 C# Socket通信 窗体控件与多线程
    Java解压缩Zip 文件
    八 C# Socket通信 通信协议设计
    CSS+DIV实现鼠标经过背景变色
    七 C# Socket通信 阻塞性线程的快速终止
    二 C# Socket通信模式
  • 原文地址:https://www.cnblogs.com/libaoquan/p/7009981.html
Copyright © 2011-2022 走看看