• 剑指 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面向对象之接口 (interface)
    防止继承和覆盖(PHP类)
    对PHP中类、继承、抽象的理解(个人总结)
    AngularJS directive 分页,待续...
    facade(外观)模式
    command (命令)模式
    javascript设计模式 富有表现力的javascript
    AngulatJS $directive compile
    directive talks to controller
    testing
  • 原文地址:https://www.cnblogs.com/fyusac/p/13203243.html
Copyright © 2020-2023  润新知