zoukankan      html  css  js  c++  java
  • 剑指 Offer 04. 二维数组中的查找

    /**
     * @Class FindNumberIn2DArray
     * @Description 剑指 Offer 04. 二维数组中的查找
     * 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
     * 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
     * <p>
     * 示例:
     * 现有矩阵 matrix 如下:
     * [
     * [1,   4,  7, 11, 15],
     * [2,   5,  8, 12, 19],
     * [3,   6,  9, 16, 22],
     * [10, 13, 14, 17, 24],
     * [18, 21, 23, 26, 30]
     * ]
     * 给定 target = 5,返回 true。
     * 给定 target = 20,返回 false。
     * <p>
     * 限制:
     * 0 <= n <= 1000
     * 0 <= m <= 1000
     * @Author
     * @Date 2020/6/28
     **/
    public class FindNumberIn2DArray {
    }
    
    /**
     * 解法1:最简单的方式是,逐个查找
     */
    public static boolean findNumberIn2DArray(int[][] matrix, int target) {
    	if (matrix == null || matrix.length == 0) return false;
    
    	int m = matrix.length;
    	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;
    }
    
    /**
     * 方式2: 利用每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
     * 先对同一列从上到下找到 第一个等于或者大于target的元素matrix[x][0],这样的话x行之后的元素都肯定比target大
     * 然后同样的方式遍历下一列,逐步缩小查找范围,直到查找结束
     */
    public static boolean findNumberIn2DArray(int[][] matrix, int target) {
    	if (matrix == null || matrix.length == 0) return false;
    
    	int m = matrix.length;
    	int n = matrix[0].length;
    	int p = 0, q = 0;
    	while (p < m && q < n) {
    		while (p < m && matrix[p][q] < target) p++;
    		if (p < m && matrix[p][q] == target) return true;
    		q++;
    		p = 0;
    	}
    
    	return false;
    }
    
    /**
     * 方式3:和2类似,但是从后向前,从上到下遍历,保证遍历过程的时间复杂度是线性的
     */
    public static boolean findNumberIn2DArray(int[][] matrix, int target) {
    	if (matrix == null || matrix.length == 0) return false;
    
    	int rows = matrix.length;
    	int cols = matrix[0].length;
    	int row = 0, col = cols - 1;
    	while (row < rows && col >= 0) {
    		int num = matrix[row][col];
    		if (num == target) return true;
    		if (num > target) col--;
    		else row++;
    	}
    	return false;
    }
    
    // 测试用例
    public static void main(String[] args) {
    	int[][] matrix = new int[][]{
    			{1, 4, 7, 11, 15},
    			{2, 5, 8, 12, 19},
    			{3, 6, 9, 16, 22},
    			{10, 13, 14, 17, 24},
    			{18, 21, 23, 26, 30}
    	};
    	int target = 5;
    	boolean ans = findNumberIn2DArray(matrix, target);
    	System.out.println("demo01 result:" + ans);
    
    	target = 20;
    	ans = findNumberIn2DArray(matrix, target);
    	System.out.println("demo02 result:" + ans);
    }
    
  • 相关阅读:
    php命令注入
    mysql事物
    安装php环境
    移除服务器缓存实例
    show user profile synchronization tools
    manual start user profile import
    JSON is undefined. Infopath Form People Picker in SharePoint 2013
    asp.net web 应用站点支持域账户登录
    Load sharepoint envirement by powershell
    sharepoint 2016 download
  • 原文地址:https://www.cnblogs.com/fyusac/p/13203243.html
Copyright © 2011-2022 走看看