• 【Lintcode】028.Search a 2D Matrix


    题目:

    Write an efficient algorithm that searches for a value in an m x n matrix.

    This matrix has the following properties:

    • Integers in each row are sorted from left to right.
    • The first integer of each row is greater than the last integer of the previous row.

    题解:

    Solution 1 ()

    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) {
            if (matrix.empty() || matrix[0].empty()) {
                return false;
            }
            
            int rowEnd = matrix.size() - 1;
            int colEnd = matrix[0].size() - 1;
            int start = 0, mid = 0;
            //rowMid
            while (start + 1 < rowEnd) {
                mid = start + (rowEnd - start) / 2;
                if (matrix[mid][0] == target) {
                    return true;
                } else if (matrix[mid][0] > target) {
                    rowEnd = mid;
                } else {
                    start = mid;
                }    
            }
            
            int row = 0; 
            if (matrix[start][0] <= target && matrix[start][colEnd] >= target) {
                row = start;
            } else if (matrix[rowEnd][0] <= target && matrix[rowEnd][colEnd] >= target) {
                row = rowEnd;
            } else {
                return false;
            }
            start = 0;
            
            //colMid
            while (start + 1 < colEnd) {
                mid = start + (colEnd - start) / 2;
                if (matrix[row][mid] == target) {
                    return true;
                } else if (matrix[row][mid] > target) {
                    colEnd = mid;
                } else {
                    start = mid;
                }    
            }
            
            if(matrix[row][start] == target || matrix[row][colEnd] == target) {
                return true;
            }
                    
            return false;
        }
    };

    Solution 2 ()

    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) {
            if (matrix.empty() || matrix[0].empty()) {
                return false;
            }
            
            int m = matrix.size(), n =  matrix[0].size();
            int start = 0;
            int end = m * n - 1;
            int mid = 0;
            
            while (start + 1 < end) {
                mid = start + (end - start) / 2;
                int row = mid / n;
                int col = mid % n;
                if (matrix[row][col] == target) {
                    return true;
                } else if (matrix[row][col] > target) {
                    end = mid;
                } else {
                    start = mid;
                } 
            }
            
            if (matrix[start / n][start % n] == target) {
                return true;
            } else if (matrix[end / n][end % n] == target) {
                return true;
            } else {
                return false;
            }
        }
    };
  • 相关阅读:
    Bootstrap 3 How-To #1 下载与配置
    一致性哈希算法及其在分布式系统中的应用
    哈希(Hash)与加密(Encrypt)的基本原理、区别及工程应用
    ASP.NET MVC3 系列教程
    浏览器对象模型BOM小结
    使用JS实现图片展示瀑布流效果
    利用JS实现购物网站商品放大镜效果
    js事件机制——事件冒泡和捕获
    js入门篇之正则表达式基础
    随机得到1-20之间的10个不相同的随机数
  • 原文地址:https://www.cnblogs.com/Atanisi/p/6821759.html
Copyright © 2020-2023  润新知