LeetCode刷题:74. Search a 2D Matrix
原题链接:https://leetcode.com/problems/search-a-2d-matrix/
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.
Example 1:
Input: matrix = [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] target = 3 Output: true
Example 2:
Input: matrix = [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] target = 13 Output: false
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
- 每行中的整数从左到右按升序排列。
- 每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入: matrix = [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] target = 3 输出: true
示例 2:
输入: matrix = [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] target = 13 输出: false
算法设计
package com.bean.algorithm.basic;
public class Search2DMatrix {
/**
* 由于这个二位数组是按照每行整数从左到右升序排序的,
* 所以可以先 target 与 数组右上角的数据比较大小。
* 如果target大于右上角的,则这一行都不存在要找的数据,可以跳过这一行,接着从下一行的最右边开始。
*
* 如果target小于右上角的,则证明target所在的那列不可能存在搜索的数据了,所以可以将列数减一,继续比较。
*
* @param matrix
* @param target
* @return
*/
public boolean searchMatrix(int[][] matrix,int target){
//判断长度为零的情况
if(matrix.length == 0){
return false;
}
//初始化行标为0
int rowIndex = 0;
//初始化列标为最右边
int cloIndex = matrix[0].length -1;
//由于行标一直 ++ 列标一直 ——
//所以进入循环的条件变为行标小于matrix.length(二位数组的行数),列标大于等于 0
while (rowIndex < matrix.length && cloIndex >= 0){
/**
* 由于这个二位数组是按照每行整数从左到右升序排序的,
* 所以可以先 target 与 数组右上角的数据比较大小。
* 如果target大于右上角的,则这一行都不存在要找的数据,可以跳过这一行,接着从下一行的最右边开始。
*
* 如果target小于右上角的,则证明target所在的那列不可能存在搜索的数据了,所以可以将列数减一,继续比较。
*
*/
if(target == matrix[rowIndex][cloIndex] ){
return true;
}else if(target > matrix[rowIndex][cloIndex]){
rowIndex++;
}else {
cloIndex--;
}
}
return false;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[][] matrix =new int[][] {
{1, 3, 5, 7},
{10, 11, 16, 20},
{23, 30, 34, 50}
};
int target = 3;
Search2DMatrix search2DMatrix=new Search2DMatrix();
boolean flag=search2DMatrix.searchMatrix(matrix, target);
System.out.println("FLAG: "+flag);
}
}
程序运行结果:
FLAG: true