题目:

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:

每行的元素从左到右升序排列。

每列的元素从上到下升序排列。

示例:

现有矩阵 matrix 如下:

[

[1, 4, 7, 11, 15],

[2, 5, 8, 12, 19],

[3, 6, 9, 16, 22],

[10, 13, 14, 17, 24],

[18, 21, 23, 26, 30]

]

给定 target = 5,返回 true。

给定 target = 20,返回 false。


思路:

二分法。

  1. 先获取当前矩阵的最大值和最小值,即左上角的值和右下角的值

    为(x1,y1)和(x2,y2)。当x1 = x2 且 y1 = y2时,说明矩阵为一个点。
  2. 求mid值,即 ( (x1+x2)/2 , (y1+y2)/2 )
  3. 将mid值与target进行比较,来决定接下来取查询那些范围

    · 如果target = mid 说明找到了目标值

    · 如果target < mid,说明以mid为最小值的那块矩阵,不会有target, target在其他范围

    · 如果target > mid,说明以mid为最大值的那块矩阵里,不会有target, target在其他范围里面
  4. 接下来对其他范围进行递归查询

代码:

class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if (matrix == null || matrix.length < 1 || matrix[0] == null || matrix[0].length < 1) {
return false;
}
return searchMatrix(matrix,target,0,0,matrix.length-1,matrix[0].length-1);
} //方法
private boolean searchMatrix(int[][] matrix, int target, int x1, int y1, int x2, int y2) {
if(x2 < x1 || y2 < y1){
return false;
}
if(target < matrix[x1][y1] || target > matrix[x2][y2]){//若果小于矩阵最小值,或者大于矩阵最大值,直接返回false。
return false;
}
int mid_x = (x1 + x2) / 2;
int mid_y = (y1 + y2) / 2; if(target == matrix[mid_x][mid_y]){
return true;
}
if(target < matrix[mid_x][mid_y]){ //target不在第四象限
return (
//查找第二象限
searchMatrix(matrix,target,x1,y1,mid_x-1,mid_y-1) ||
//查找第一象限
searchMatrix(matrix,target,x1,mid_y,mid_x-1,y2) ||
//查找第三象限
searchMatrix(matrix,target,mid_x,y1,x2,mid_y-1)
);
}else { //target不在第二象限
return (
//查找第四象限
searchMatrix(matrix, target,mid_x+1,mid_y+1,x2,y2) ||
//查找第一象限
searchMatrix(matrix,target,x1,mid_y+1,mid_x,y2) ||
//查找第三象限
searchMatrix(matrix,target,mid_x+1,y1,x2,mid_y)
);
}
}
}

但是我看其他人提交的代码,思路是从左下 或者 右上开始遍历。

思路是:

从左下角角标开始查找

如果>target 则向上移动角标

如果<target 则向右移动角标

如果==target 则返回True

如果角标出界还没找到target 则返回False

但是我认为这种不是最优的,比如二维数组只有一行或者一列的话,这就是一次时间复杂度为O(n)的遍历。

代码如下(代码是从右上角开始的)

class Solution {
public boolean searchMatrix(int[][] matrix, int target){
if (matrix.length==0)
return false;
int i = matrix.length-1,j=0;
while(i>=0 && j<matrix[0].length){
if (matrix[i][j] == target)
return true;
else if(matrix[i][j]>target)
i--;
else if(matrix[i][j]<target)
j++;
}
return false;
}
}

leetcode240 搜索二维矩阵 II的更多相关文章

  1. leetcode-240搜索二维矩阵II

    搜索二维矩阵II class Solution: def searchMatrix(self, matrix, target): """ :type matrix: Li ...

  2. [Swift]LeetCode240. 搜索二维矩阵 II | Search a 2D Matrix II

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  3. lintcode:搜索二维矩阵II

    题目 搜索二维矩阵 II 写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每一列的整数从上到下是排序的. 在每一行或每一列中没 ...

  4. LintCode-38.搜索二维矩阵 II

    搜索二维矩阵 II 写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每一列的整数从上到下是排序的. 在每一行或每一列中没有重复 ...

  5. Leetcode 240.搜索二维矩阵II

    搜索二维矩阵II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列. 每列的元素从上到下升序排列. 示例: 现有 ...

  6. Leetcode之二分法专题-240. 搜索二维矩阵 II(Search a 2D Matrix II)

    Leetcode之二分法专题-240. 搜索二维矩阵 II(Search a 2D Matrix II) 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵 ...

  7. LeetCode 240. 搜索二维矩阵 II(Search a 2D Matrix II) 37

    240. 搜索二维矩阵 II 240. Search a 2D Matrix II 题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性 ...

  8. Java实现 LeetCode 240 搜索二维矩阵 II(二)

    240. 搜索二维矩阵 II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列. 每列的元素从上到下升序排列. ...

  9. 240. 搜索二维矩阵 II

    二维数组搜索 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列. 每列的元素从上到下升序排列. 示例: 现有矩阵 ...

随机推荐

  1. MVC和MVP区别

    从这幅图可以看到,我们可以看到在MVC里,View是可以直接访问Model的!从而,View里会包含Model信息,不可避免的还要包括一些业务逻辑. 在MVC模型里,更关注的Model的不变,而同时有 ...

  2. jq 点击除了某元素以外的其他所有元素

    $('body').click(function(e){ if(($(e.target).attr('class')!='header-top-nav-ipt')){ alert('除了class=h ...

  3. 绝对好用Flash多文件大文件上传控件

    本实例采用的是Uploadify上传插件,.NET程序,源程序是从网上找的,但是有Bug,已经修改好,并标有部分注释.绝对好用,支持单文件.多文件上传,支持大文件上传,已经过多方面测试,保证好用. 以 ...

  4. iOS服务器数据请求"汉字编码"问题

    下面记录一下数据请求问题: 1.不知道大家有木有遇到过,当数据请求的URL带有汉字的时候,请求数据肯定会报404错误,也就是参数或者是接口URL错误<虽然说404,500等错误一般都是服务器问题 ...

  5. Jenkins - 【转】高效插件推荐

    特别说明:本文是在原文基础上的改写和添加,但总体不影响原文表达,特此说明. 原文链接 - Jenkins 高效插件推荐 | 运维生存时间 前言 开源版本的Jenkins具有三大能力: Master-S ...

  6. django基础窗口类的使用

    django基础窗口form表单的运用 具体效果图如下: 首先确定表单中的数据集,先自己创建一个forms.py或者在原来的models.py中添加: 1代码如下 class ContactForm( ...

  7. PJzhang:QQ输入法用户许可协议和隐私政策阅读

    猫宁!!! 参考链接:http://qq.pinyin.cn/ 中国用户量最大的输入法是搜狗输入法,百度输入法也有上亿的用户量. 我下载了7个输入法,查看他们的用户许可协议和隐私政策情况.这里说的都是 ...

  8. web学习(2019-10)

    @“fuzz一下”:所有注入爆破题/其他题,必fuzz 在安全测试中,模糊测试(fuzz testing)是一种介于完全的手工渗透测试与完全的自动化测试之间的安全性测试类型 模糊测试(fuzz tes ...

  9. 记录几个常用的Css样式效果

    1.更改字体,图标大小小于12px无效的问题 若我们设置font-size:10px是不会有效果的,需要使用 transform: scale(0.68); 更改字体最小大小 2.设置div边框虚化, ...

  10. GIT命令总结,so easy

    一:GIT命令实战(码云) https://oschina.gitee.io/learn-git-branching/ 提交 git commit 创建分支 git branch <name&g ...