题目:

搜索二维矩阵

写出一个高效的算法来搜索 m × n矩阵中的值。

这个矩阵具有以下特性:

  • 每行中的整数从左到右是排序的。
  • 每行的第一个数大于上一行的最后一个整数。
样例

考虑下列矩阵:

[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]

给出 target = 3,返回 true

挑战

O(log(n) + log(m)) 时间复杂度

解题:

更新730

直接二分查找

    public boolean searchMatrix(int[][] A, int target) {
// write your code here
if(A == null || A.length == 0 || A[0].length ==0)
return false;
int row = A.length;
int col = A[0].length;
int len = row * col;
int left = 0;
int right = len-1 ;//
while(left <= right){
int mid = left + (right - left)/2;
int x = A[mid/col][mid%col];
if(x==target){
return true;
}else if(x>target){
right = mid-1;
}else{
left = mid+1;
}
}
return false;
}

1.最简单的方法就是遍历整个矩阵,时间复杂度:O(log(mn)),这个应该等于O(long(n)+log(m))

2.题目给的矩阵是有序矩阵,先按照最后一列二分查找,确定列,再二分确定行,时间复杂度O(log(m)) + O(log(n)),哦,哦,哦,题目的挑战可能是搞错了。。。

1.暴力

Java程序:

public class Solution {
/**
* @param matrix, a list of lists of integers
* @param target, an integer
* @return a boolean, indicate whether matrix contains target
*/
public boolean searchMatrix(int[][] matrix, int target) {
// write your code here 二分查找
if(matrix==null)
return false;
int m = matrix.length;
if(m==0)
return false;
int n = matrix[0].length;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++)
if(matrix[i][j]==target)
return true;
}
return false;
}
}

总耗时: 1571 ms

Python程序:

class Solution:
"""
@param matrix, a list of lists of integers
@param target, an integer
@return a boolean, indicate whether matrix contains target
"""
def searchMatrix(self, matrix, target):
# write your code here
if matrix==None:
return False
m = len(matrix)
if m==0:
return False
n = len(matrix[0])
for i in range(m):
for j in range(n):
if matrix[i][j]==target:
return True
return False

总耗时: 260 ms

2.二分法

利用二分思想程序,先求所在的行,再求所在的列,搞了好久,边界错了好多次。。。

Java程序:

public class Solution {
/**
* @param matrix, a list of lists of integers
* @param target, an integer
* @return a boolean, indicate whether matrix contains target
*/
public boolean searchMatrix(int[][] matrix, int target) {
// write your code here 二分查找
if(matrix==null)
return false;
int nrow = matrix.length;
if(nrow==0)
return false;
int ncol = matrix[0].length;
// 行 nrow
//列 ncol
int row = rowbinSearch(matrix,0,nrow-1,ncol,target);
int col = colbinSearch(matrix,0,ncol-1,row,target);
if(col!=-1)
return true;
return false;
}
// 找出所在的行
private int rowbinSearch(int[][] matrix,int left,int right,int ncol,int target){
//矩阵matrix ,二分的两个界:left、right,矩阵的最后一列ncol,目标值target
int median = (left + right)/2;
int row = median;
if(left==right)
return left;
if(matrix[left][ncol-1]<=target && matrix[left+1][ncol-1]>target)
return left;
if(matrix[median][ncol-1]>= target && matrix[median][0]<=target)
return median;
if(matrix[median][ncol-1]<target)
row = rowbinSearch(matrix,median+1,right,ncol,target);
else
row = rowbinSearch(matrix,left,median-1,ncol,target);
return row;
}
// 找出所在的列
private int colbinSearch(int[][] matrix,int left,int right,int row,int target){
//矩阵matrix ,二分的两个界:left、right,target所在的行: row,目标值target
int median = (left + right)/2;
int col = median;
if(left>right)
return -1;
if(left==right && matrix[row][left]!=target)
return -1;
if(matrix[row][median]==target)
return median;
if(matrix[row][median]<target)
col = colbinSearch(matrix,median+1,right,row,target);
else
col = colbinSearch(matrix,left,median-1,row,target);
return col;
}
}

总耗时: 2246 ms

3.暴力2.0

九章算法中看到的,给的Java程序利用二分法,但是没有用递归,给的Python程序,没有明显的用到矩阵变量,但是通过商和余数确定所在的行和列

Python程序:

class Solution:
"""
@param matrix, a list of lists of integers
@param target, an integer
@return a boolean, indicate whether matrix contains target
"""
def searchMatrix(self, matrix, target):
# write your code here
if len(matrix)==0:
return False
n,m=len(matrix),len(matrix[0])
start,end = 0,n*m-1
while start+1< end:
mid = (start + end)/2
x,y = mid/m,mid%m
if matrix[x][y]<target:
start = mid
else:
end = mid
x,y = start/m,start%m
if matrix[x][y]==target:
return True
x,y = end/m,end%m
if matrix[x][y] == target:
return True
return False

总耗时: 261 ms

更新

可每次去除一行或者一列,这样划分的形式解题

时间复杂度O(M+N)

public class Solution {
/**
* @param matrix, a list of lists of integers
* @param target, an integer
* @return a boolean, indicate whether matrix contains target
*/
public boolean searchMatrix(int[][] matrix, int target) {
// write your code here
if(matrix == null || matrix.length == 0 || matrix[0].length ==0)
return false;
int row = 0;
int col = matrix[0].length-1;
return searchMatrix(matrix,row,col,target);
}
// 右上角开始是找
public boolean searchMatrix(int[][] mat,int row,int col,int target){
if(row<0 || row>= mat.length || col<0 || col>mat[0].length)
return false;
if(mat[row][col] == target)
return true;
else if(mat[row][col] < target)
return searchMatrix(mat,row+1,col,target);
else
return searchMatrix(mat,row,col-1,target);
}
}

该成递归形式

注意下面的两个while循环

public class Solution {
/**
* @param matrix, a list of lists of integers
* @param target, an integer
* @return a boolean, indicate whether matrix contains target
*/
public boolean searchMatrix(int[][] matrix, int target) {
// write your code here
if(matrix == null || matrix.length == 0 || matrix[0].length ==0)
return false;
int row = 0;
int col = matrix[0].length-1;
// 注意下面两个while 循环 row col 都要判断的
while(row< matrix.length&& col>=0){
while(row< matrix.length&& col>=0){
if (matrix[row][col] == target){
return true;
}else if(matrix[row][col] > target){
col--;
}else{
row++;
}
}
}
return false;
} }

lintcode :搜索二维矩阵的更多相关文章

  1. lintcode:搜索二维矩阵II

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

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

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

  3. LeetCode74.搜索二维矩阵

    74.搜索二维矩阵 描述 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 示 ...

  4. LeetCode:搜索二维矩阵【74】

    LeetCode:搜索二维矩阵[74] 题目描述 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的 ...

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

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

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

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

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

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

  8. LeetCode 74. 搜索二维矩阵(Search a 2D Matrix)

    74. 搜索二维矩阵 74. Search a 2D Matrix 题目描述 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. ...

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

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

随机推荐

  1. easyUI中treegrid组件构造树形表格(简单数据类型)+ssm后台

    这几天做的项目要求用树形表格的形式展示一部分数据,于是就想到了使用easyUI的treegrid组件,但几经翻查各种资料,发现数据类型大多采取标准数据类型,即包含children元素的数据类型,小编查 ...

  2. asp.net2.0 国际化

    公司业务需要在国外开展了, 因此以前的系统要做多国语言了, 从网上搜集了好多资料, 最后选择了一个比较简单的方案 1.  打开vs2005, 新建网站, 首先在配置文件中添加配置: <syste ...

  3. Node.js学习资料整理

    了解node,node主要能干啥? Node.js究竟是什么?:http://www.ibm.com/developerworks/cn/opensource/os-nodejs/ nodejs教程: ...

  4. WinForm 实现验证码

    private void CheckIdentifyingCode() { Random r = new Random(); string str = ""; for (int i ...

  5. V2EX社区

    无论你是在大学进行人生最重要阶段的学习,或者是在中国的某座城市工作,或者是在外太空的某个天体如 Sputnik 1 上享受人生,在注册进入 V2EX 之后,你都可以为自己设置一个所在地,从而找到更多和 ...

  6. 玄机宝盒v1.6.1.1

    最新版本:玄机宝盒v1.6.1.1 玄机宝盒v1.6.1.1 04-14/2016 给你的将是无与伦比的体验http://bbs.msdn5.com/thread-15-1-1.html(出处: 玄机 ...

  7. silverlight 文本框只能输入数字

    void mobile_KeyUp(object sender, KeyEventArgs e) { Regex rg = new Regex("^[0-9]{1,11}$"); ...

  8. Delphi XE5教程11:Tokens

    内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误!也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者可 ...

  9. 敏捷开发之道(四)Scrum概述

    上次的博文敏捷开发之道(二)极限编程XP和敏捷开发之道(三)极限编程XP续中,我们介绍了一下敏捷开发中的XP开发方法,今天咱们来了解另一个比较流行的敏捷开发方法--Scrum. 1.Scrum简介 S ...

  10. 标签跳转break和continue

    标签是后面跟有冒号的标识符,例如  label1: 在java中,标签起作用的唯一的地方刚好是在迭代语句之前. “刚好之前”的意思表明,在标签和迭代之间置入热和语句都不好. 而在迭代之前设置标签的唯一 ...