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
.
二分查找法的变形。做法是先判断头一列的大小,再判断同一行的大小。注意边界。
另外一种思路是考虑转化为一维数组。没试验。
本次用的方法从时间消耗图上看速度比较差,有机会再改进吧。
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package Reverse;
/**
*
* @author suisuihan
*/
public class SearchMarix {
public boolean searchMatrix(int[][] matrix, int target) {
int row = matrix.length;
int column = matrix[0].length;
if (row <= 0 || column <= 0) {
return false;
}
if (matrix[0][0] > target || matrix[row - 1][column - 1] < target) {
return false;
}
if (row == 1 && column == 1) {
if (matrix[0][0] == target) {
return true;
} else {
return false;
}
} else if (row > 1 && column == 1) {
int begin = 0, end = row - 1;
while (begin <= end) {
int middle = begin + ((end - begin) >> 1);
if (matrix[middle][0] > target) {
end = middle - 1;
} else if (matrix[middle][0] < target) {
begin = middle + 1;
} else {
return true;
}
}
return false;
} else if (row == 1 && column > 1) {
int head = 0, tail = column - 1;
while (head <= tail) {
int middle = head + ((tail - head) >> 1);
if (matrix[0][middle] > target) {
tail = middle - 1;
} else if (matrix[0][middle] < target) {
head = middle + 1;
} else {
return true;
}
}
return false;
} else {
int begin = 0, end = row - 1;
while (begin <= end) {
int middle = begin + ((end - begin) >> 1);
if (matrix[middle][0] > target) {
end = middle - 1;
} else if (matrix[middle][0] < target) {
begin = middle + 1;
} else {
return true;
}
}
int head = 0, tail = column - 1;
int rowNum = begin>end?end:begin;
while (head <= tail) {
int middle = head + ((tail - head) >> 1);
if (matrix[rowNum][middle] > target) {
tail = middle - 1;
} else if (matrix[rowNum][middle] < target) {
head = middle + 1;
} else {
return true;
}
}
return false;
}
}
public static void main(String[] args) {
int[][] A = {{1,3,5,7},{10,11,16,20},{23,30,34,50}};
SearchMarix test = new SearchMarix();
test.searchMatrix(A, 24);
}
}