leetcode------Search a 2D Matrix

标题: Search a 2D Matrix
通过率 31.3%
难度 中等

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.

 

For example,

Consider the following matrix:

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

Given target = 3, return true.

本题思路清晰,就是再一个二维数组中找某个元素,那么立即想到了二分法,关键点,按行算,第k个元素的行数等于k/列数,列数等于k%列数。

还有一种思路就是,每一行的开头一定比上一行全部元素都大,那么从最后一行的第一个开始,每次比较每行的第一个,找到第一个比target小的元素,也就说明了target若存在一定在那一行,

1、二分法查找代码如下:

 1 public class Solution {
 2     public boolean searchMatrix(int[][] matrix, int target) {
 3         if(matrix==null || matrix.length==0 || matrix[0].length==0) 
 4             return false;
 5  
 6         int m = matrix.length;
 7         int n = matrix[0].length;
 8  
 9         int start = 0;
10         int end = m*n-1;
11  
12         while(start<=end){
13             int mid=(start+end)/2;
14             int midX=mid/n;
15             int midY=mid%n;
16  
17             if(matrix[midX][midY]==target) 
18                 return true;
19  
20             if(matrix[midX][midY]<target){
21                 start=mid+1;
22             }else{
23                 end=mid-1;
24             }
25         }
26  
27         return false;
28     }
29 }

2、查找第一个小的数:

 1 public class Solution {
 2     public boolean searchMatrix(int[][] matrix, int target) {
 3         int m=matrix.length;
 4         int n=matrix[0].length;
 5         int i=m-1;
 6         int j=0;
 7         while(i>=0){
 8             if(matrix[i][0]>target)i--;
 9             else break;
10         }
11         if(i<0)return false;
12         while(j<n){
13             if(matrix[i][j]==target)return true;
14             else j++;
15         }
16         return false;
17         
18     }
19 }

3、python代码:

 1 class Solution:
 2     def searchMatrix(self, matrix, target):
 3         i, j = 0, len(matrix[0]) - 1
 4         while i < len(matrix) and j >= 0:
 5             if target < matrix[i][j]:
 6                 j -= 1
 7             elif target > matrix[i][j]:
 8                 i += 1
 9             else:
10                 return True
11         return False

 

posted @ 2015-02-10 11:20  pku_smile  阅读(197)  评论(0编辑  收藏  举报