题目:

搜索二维矩阵

写出一个高效的算法来搜索 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. 例题6-8 Tree Uva548

    这道题我一直尝试用scanf来进行输入,不过一直没有成功,因此先搁置一下,以后积累些知识再进行尝试. 这道题有两种解决方案: 即先建树,再遍历和边建树边遍历.这两种方案经过实践证实效率相差不太多.应该 ...

  2. hadoop分布式安装过程

    一.安装准备及环境说明 1.下载hadoop-1.2.1,地址:http://apache.spinellicreations.com/hadoop/common/stable/hadoop-1.2. ...

  3. Nginx启动、停止与平滑重启

    如何启动Nginx:/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 停止Nginx:可以发送向通信号给Nginx主进程的 ...

  4. 强大的网络通信框架(不实现缓存)--第三方开源--AsyncHttpClient

    AsyncHttpClient是一款比较流行的Android异步网路加载库,在github上的网址是:https://github.com/loopj/android-async-http但是Asyn ...

  5. virtualbox centos安装增强工具

    系统的,VBoxLinuxAdditions-amd64.run 是用于64位系统的.执行以下命令来安装sh ./VBoxLinuxAdditions-x86.run 5.安装成功后重启系统.

  6. 加载驱动模块时Device or resource busy的解决方法

    加载驱动模块时Device or resource busy的解决方法 加载驱动模块时Device or resource busy的解决方法 insmod或modprobe驱动模块时Device o ...

  7. verilogHDL设计中的同步时序逻辑

    引用自夏宇闻教授 1.同步时序逻辑: 是指表示状态的寄存器组的值只能在唯一确定的触发条件发生改变. 只能由时钟的正跳变沿或者负跳变沿触发的状态机就是一例,always@(posedge clk). 1 ...

  8. 一点ASP.NET MVC Html.Helper类的方法

    一点ASP.NET MVC Html.Helper类 这里就只写一个Html.ActionLink()和Html.DropdownList(). Html.ActionLink()里有三个参数,第一个 ...

  9. AvalonDock 2.0+Caliburn.Micro+MahApps.Metro实现Metro风格插件式系统(一)

    随着IOS7由之前UI的拟物化设计变为如今的扁平化设计,也许扁平化的时代要来了,当然我们是不是该吐槽一下,苹果什么时候也开始跟风了,自GOOGLE和微软界面扁平化过后,苹果也加入了这一队伍. Aval ...

  10. socket编程实现HTTP请求

    利用c++语言+socket实现HTTP请求,请求获得的数据效果图如下: HTTP协议的下一层是TCP,根据HTTP协议只需要利用TCP发送下面的数据到达目标主机,目标主机就会发送相应的数据到客户端. ...