(java) Search a 2D Matrix
2016-02-16 21:46
501 查看
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:
Given target =
思路,就是用二分查找先找行再找列!
代码如下(已通过leetcode)
public class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int row=findrow(matrix, target, 0, matrix.length-1);
//System.out.println("第"+row+"行");
if(findit(matrix, row, target, 0, matrix[row].length-1)==Integer.MIN_VALUE) return false;
else {
//int position=findit(matrix, row, target, 0, matrix[row].length-1);
//System.out.println("第"+row+"行"+"第"+position+"位");
return true;
}
}
public int findrow(int[][] matrix,int target,int low,int high) {
while(low<=high) {
if(matrix[low][matrix[low].length-1]<target) low++;
else {
return low;
}
}
return low-1;
}
public int findit(int[][] matrix,int row,int target,int low,int high) {
if(low>high) return Integer.MIN_VALUE;
int mid=(low+high)/2;
if(matrix[row][mid]==target) return mid;
else {
if(matrix[row][mid]>target){
high=mid-1;
} else {
low=mid+1;
}
return findit(matrix, row, target, low, high);
}
}
}
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.
思路,就是用二分查找先找行再找列!
代码如下(已通过leetcode)
public class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int row=findrow(matrix, target, 0, matrix.length-1);
//System.out.println("第"+row+"行");
if(findit(matrix, row, target, 0, matrix[row].length-1)==Integer.MIN_VALUE) return false;
else {
//int position=findit(matrix, row, target, 0, matrix[row].length-1);
//System.out.println("第"+row+"行"+"第"+position+"位");
return true;
}
}
public int findrow(int[][] matrix,int target,int low,int high) {
while(low<=high) {
if(matrix[low][matrix[low].length-1]<target) low++;
else {
return low;
}
}
return low-1;
}
public int findit(int[][] matrix,int row,int target,int low,int high) {
if(low>high) return Integer.MIN_VALUE;
int mid=(low+high)/2;
if(matrix[row][mid]==target) return mid;
else {
if(matrix[row][mid]>target){
high=mid-1;
} else {
low=mid+1;
}
return findit(matrix, row, target, low, high);
}
}
}
相关文章推荐
- Java基础05 实施接口
- RXJava学习笔记(2)
- Java基础04 封装与接口
- Java基础03 构造器与方法重载
- 六种常用的设计模式java实现(二)单例模式
- Java基础02 方法与数据成员
- Missing artifact javax.transaction:jta:jar:1.0.1B解决办法
- 【JAVA】12、循环结构
- 从头认识Spring-2.5 @Autowire @Inject @Qualifier @Named的相同与不同
- Java 键盘上各个按键的KeyCode值
- Java描述贪心算法求解单元点最短路径问题
- java中goto语句
- 从头认识Spring-2.4 基于java的标准注解装配-@Inject-限定器@Named
- Struts2 零配置文件
- struts2 零配置代码
- Java基本类型和取值范围
- (转)JAVA中堆和栈的区别
- ssh(struts2.3.8+spring3.2+heibernate4.1+annotation零配置
- Java基础01 从HelloWorld到面向对象
- JVM调优-Java中的对象