题目描述

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

解题思路

  • 我记得在leetcode上也有这么一道题“240. 搜索二维矩阵 II”,最开始用了暴力搜索发现超时,最后我写了一个将数组分为两半查找过了。
  • 二维数组是有序的,从右上角来看,向左数字递减,向下数字递增。
    因此从右上角开始查找,
    • 当要查找数字比右上角数字大时,下移;
    • 当要查找数字比右上角数字小时,左移;
    • 如果出了边界,则说明二维数组中不存在该整数。
最优算法图解

[剑指Offer]-二维数组中的查找

参考代码:
package offer;

/**
 * 二维数组查找 左到右变大  上到下变大  找右上角  小与列则删一列大于列则删一行
 */
public class Offer4 {
    /*
     * 1  2  8  9
     * 2  4  9  12
     * 4  7  10 13
     * 6  8  11 15
     */
    public static void main(String[] args) {
        int array[][] = new int[4][4];
        array[0][0] = 1;
        array[0][1] = 2;
        array[0][2] = 8;
        array[0][3] = 9;
        array[1][0] = 2;
        array[1][1] = 4;
        array[1][2] = 9;
        array[1][3] = 12;
        array[2][0] = 4;
        array[2][1] = 7;
        array[2][2] = 10;
        array[2][3] = 13;
        array[3][0] = 6;
        array[3][1] = 8;
        array[3][2] = 11;
        array[3][3] = 15;
        System.out.println(find(array, 7));
        System.out.println(find(array, 5));
    }

    private static boolean find(int[][] arr, int keyNumber) {
        if (arr.length == 0) {
        } else {
            int column = arr[0].length - 1;     // 列  最右的那列
            int row = 0;                        // 行
            while (column >= 0 && row < arr.length) {
                if (arr[row][column] == keyNumber) {
                    return true;
                } else if (arr[row][column] > keyNumber) {
                    column--;
                } else {
                    row++;
                }
            }
        }
        return false;
    }


}

领口上侥幸通过的写法!????

class Solution {
    public  boolean searchMatrix(int[][] matrix, int target) {

		for (int i = 0; i < matrix.length / 2; i++) { // 行
			for (int j = 0; j < matrix[i].length; j++) { // 列
				if (target == matrix[i][j])
					return true;
			}

		}
		for (int i = matrix.length-1; i >= matrix.length / 2; i--) { // 行
			for (int j = 0; j < matrix[i].length; j++) { // 列
				if (target == matrix[i][j])
					return true;
			}

		}

		return false;
	}
}

附录

该题源码在我的 ????Github 上面!

相关文章:

  • 2021-11-07
  • 2022-02-10
  • 2021-09-18
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-01-11
  • 2021-06-06
  • 2021-12-09
  • 2021-11-28
  • 2021-05-15
  • 2021-11-29
相关资源
相似解决方案