LeetCode 240——搜索二维矩阵 II
1. 题目

2. 解答
2.1. 方法一
从矩阵的左下角开始比较
- 目标值等于当前元素,返回 true;
- 目标值大于当前元素,j 增 1,向右查找,排除掉此列上边的数据(都比当前元素更小);
- 目标值小于当前元素,i 减 1,向上查找,排除掉此行右边的数据(都比当前元素更大)。
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int i = matrix.size() - 1;
        int j = 0;
        while (i >=0 && j < matrix[0].size())
        {
            if (target == matrix[i][j]) return true;
            else if (target > matrix[i][j]) j++;
            else i--;
        }
        return false;
    }
};
2.2. 方法二
\]
我们先沿着对角线的方向,找到第一个大于目标值的数字。比如目标值 14,我们发现 9<14<17。然后左上角和右下角的元素都可以排除掉了。我们只需再对左下角剩余的行和右上角剩余的列分别进行二分查找即可。
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int m = matrix.size();
        if (m == 0) return false;
        int n = matrix[0].size();
        if (n == 0) return false;
        if (m == 1) return binary_row_search(matrix, 0, n-1, target);
        if (n == 1) return binary_col_search(matrix, 0, m-1, target);
        int square = m <= n ? m : n;
        int i = 0;
        for (i = 0; i < square - 1; i++)
        {
            if (target == matrix[i][i] || target == matrix[i+1][i+1]) return true;
            else if (target > matrix[i][i] && target < matrix[i+1][i+1]) break;
        }
        for (int row = i+1; row < m; row++)
        {
            if (binary_row_search(matrix, row, i, target)) return true;
        }
        for (int col = i+1; col < n; col++)
        {
            if (binary_col_search(matrix, col, i, target)) return true;
        }
        return false;
    }
    // 行搜索
    bool binary_row_search(vector<vector<int>>& matrix, int row, int end, int target)
    {
        int start = 0;
        while (start <= end)
        {
            int mid = start + ((end - start) >> 2); // 右移运算优先级小于加法,切记加括号!!!
            if (matrix[row][mid] == target) return true;
            else if (matrix[row][mid] < target) start = mid + 1;
            else end = mid - 1;
        }
        return false;
    }
    // 列搜索
    bool binary_col_search(vector<vector<int>>& matrix, int col, int end, int target)
    {
        int start = 0;
        while (start <= end)
        {
            int mid = start + ((end - start) >> 2);
            if (matrix[mid][col] == target) return true;
            else if (matrix[mid][col] < target) start = mid + 1;
            else end = mid - 1;
        }
        return false;
    }
};
获取更多精彩,请关注「seniusen」!

LeetCode 240——搜索二维矩阵 II的更多相关文章
- LeetCode 240. 搜索二维矩阵 II(Search a 2D Matrix II) 37
		240. 搜索二维矩阵 II 240. Search a 2D Matrix II 题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性 ... 
- Java实现 LeetCode 240 搜索二维矩阵 II(二)
		240. 搜索二维矩阵 II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列. 每列的元素从上到下升序排列. ... 
- Leetcode 240.搜索二维矩阵II
		搜索二维矩阵II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列. 每列的元素从上到下升序排列. 示例: 现有 ... 
- LeetCode 240 - 搜索二维矩阵 II
		编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列.每列的元素从上到下升序排列.示例: 现有矩阵 matrix 如 ... 
- LeetCode 240. 搜索二维矩阵 II(Search a 2D Matrix II)
		题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列. 每列的元素从上到下升序排列. 示例: 现有矩阵 m ... 
- Java实现 LeetCode 240 搜索二维矩阵 II
		public static boolean searchMatrix(int[][] matrix, int target) { if(matrix.length == 0) return false ... 
- Leetcode之二分法专题-240. 搜索二维矩阵 II(Search a 2D Matrix II)
		Leetcode之二分法专题-240. 搜索二维矩阵 II(Search a 2D Matrix II) 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵 ... 
- 【LeetCode】 240. 搜索二维矩阵 II
		题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列. 每列的元素从上到下升序排列. 示例: 现有矩阵 mat ... 
- 240. 搜索二维矩阵 II
		二维数组搜索 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列. 每列的元素从上到下升序排列. 示例: 现有矩阵 ... 
随机推荐
- OpenID Connect Core 1.0(三)验证
			OpenID Connect执行终端用户登录或确定终端用户已经登录的验证工作.OpenID Connect 使服务器以一种安全的方式返回验证结果.所以客户可以依靠它.出于这个原因,在这种情况下客户被称 ... 
- day 03 --Haproxy 增加, 删除,查询
			key 知识点:函数的定义, 函数的递归调用, flag 标志位的使用,eval() 函数 #!C:\Program Files\Python35\bin # -*- conding:utf-8 -* ... 
- Core Data实例
			#import <UIKit/UIKit.h> #import <CoreData/CoreData.h> @interface CHViewController : UIVi ... 
- Eclipse新导入的项目中ctrl+点击指定方法名或类名没有反应,不能跳转问题
			项目没有转成java项目 解决方法:右击项目名---选择properties----点击Project Facets,这样就可以实现ctrl+左键点击跳转了. 转成java项目后会报错 解决办法:选中 ... 
- Ubuntu更换国内源
			打开终端,输入:sudo gedit /etc/apt/sources.list 在文件最底部输入以下内容: deb http://mirrors.ustc.edu.cn/ubuntu/ xenial ... 
- 关于MySQL自增主键的几点问题(上)
			前段时间遇到一个InnoDB表自增锁导致的问题,最近刚好有一个同行网友也问到自增锁的疑问,所以抽空系统的总结一下,这两个问题下篇会有阐述. 1. 划分三种插入类型 这里区分一下几种插入数据行的类型,便 ... 
- 解决echarts 鼠标悬浮提示 文本提示问题。
			参考文章:https://www.jianshu.com/p/aa585c304660 官方文章样式详解:http://echarts.baidu.com/option.html#tooltip.fo ... 
- vue 整体引入 mint-ui 样式失败
			当引入Mint-ui 整体css 时 如果出现了这样的错误, 是指找不到对应的Mint-UI 的css :需要从node_modules里寻找 解决方法是在webpack.config.js(有的项目 ... 
- Redis学习笔记(一)
			定义 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库. 从该定义中抽出几个关键信息,以表示Redis的特性: 存储结构:key-val ... 
- JS第一周学习笔记整理
			目录 JS正式课第一周笔记整理 JS正式课第一周笔记整理 webstorm : 代码编辑器 浏览器: 代码解析器: Git : 是一个工具;用于团队协作开发项目管理代码的工具:在工作中用git.svn ... 
