二维数组中的查找

基础知识

1 数组和字符串是两种最基本的数据结构,它们用连续内存分别存储数字和字符

2 栈是一个与递归紧密相关的数据结构,

3 队列也与广度优先遍历算法紧密相关,

4 数组可以说是最简单的一种数据结构,它占据一块连续的内存并按照顺序存储数据。创建数组时,我们需要首先指定数组的容量大小,然后根据大小分配内存。即使我们只在数组中存储一个数字,也需要为所有的数据预先分配内存。因此数组的空间效率不是很好,经常会有空闲的区域没有得到充分利用。

5 为了解决数组空间效率不高的问题,人们又设计实现了多种动态数组,比如C++的 STL中的vector。把之前的数据复制到新的数组中,再把之前的内存释放,这样就能减少内存的浪费。但我们也注意到每一次扩充数组容量时都有大量的额外操作,这对时间性能有负面影响,因此使用动态数组时要尽量减少改变数组容量大小的次数。

题目描述

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

 

1、思路

首先选取数组中右上角的数字。如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数组,剔除这个数字所在的列;如果该数字小于要查找的数字,剔除这个数字所在的行。也就是说如果要查找的数字不在数组的右上角,则每一次都在数组的查找范围中剔除一行或者一列,这样每一步都可以缩小查找的范围,直到找到要查找的数字,或者查找范围为空。

2、举例

如果在一个二维数组中找到数字7,则返回true,如果没有找到,则返回false。

 

查找过程如下:

方法2

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        if(matrix == null || matrix.length == 0)
            return false;
        
        int row = 0, col = matrix[0].length - 1;
        while (row < matrix.length && col >= 0) {
            if (target == matrix[row][col])
                return true;
            else if (target > matrix[row][col])
                row++;
            else
                col--;
        }
        return false;
    }
}

 

 

/**
 * @Auther: liuhaidong
 * Data: 2019/10/9 0009、22:00
 * Description:
 * @version: 1.0
 */
public class ArrayListTest {
    public static void main(String[] args) {
        int[][] arr = {
  {1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
//        int[][] arr ={
  {1}};
        int a = 7;
        System.out.println(find(arr,a));
    }

    private static boolean find(int[][] arr, int a) {
        // 输入条件判断
        if (arr == null || arr.length < 1 || arr[0].length < 1) {
            return false;
        }

        for(int j = arr[0].length-1;j >= 0;j--){
            for(int i =0;i<=arr.length-1;i++){
                if(arr[i][j] > a){
                    break;
                }
                if(arr[i][j] < a){
                    continue;
                }
                if (arr[i][j] == a){
                    return true;
                }
            }
        }
        return false;
    }