• [剑指offer]二维数组中的查找


    二维数组中的查找

    题目描述

    在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
    例如:下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字7,则返回true;如果查找数字5,由于数组不含有该数字,则返回false。

    思路1

    观察特点,以左下角元素为起点,上方的元素都比这个数小,右边的元素都比这个数大。所以如果target与array[i][j]比较的三种形式

    • 相等,true
    • 小于,i--,往上方元素找
    • 大于,j++,往右方元素找
      类似的可以推出起点在右上角的情况,主要是通过区分一大一小可以确定下一个比较元素的大致寻找方向。左下角为起点的代码如下
    public class Solution {
        public boolean Find(int target, int [][] array) {
            int rows = array.length;
            int cols = array[0].length;
            int i = rows - 1,j = 0;
            while(i >= 0 && j < cols){
                if(target == array[i][j])
                    return true;
                if(target < array[i][j]){
                    i--;
                    continue;
                }
                if(target > array[i][j]){
                    j++;
                    continue;
                }
            }
            return false;
        }
    }
    

    思路2

    对每一行进行二分查找,逐行进行遍历

    public class Solution {
        public boolean Find(int target, int [][] array) {
            int rows = array.length;
            int cols = array[0].length;
            for(int i = 0; i < rows; i++){
                int low = 0;
                int high = cols - 1;
                while(low <= high){
                    int mid = (low + high) / 2;
                    if(target < array[i][mid])
                        high = mid - 1;
                    else if(target > array[i][mid])
                        low = mid + 1;
                    else
                        return true;
                }
            }
            return false;
        }
    }
    
    日积月累,水滴石穿
  • 相关阅读:
    洛谷-P1591 阶乘数码
    洛谷-P1328 生活大爆炸版石头剪刀布
    git的使用
    docker下载命令
    springboot学习笔记
    内部类被实例化才会被加载进内存测试
    springboot环境搭建遇到的问题
    Java多线程的锁机制
    spring JdbcTemplate学习
    多线程循环注意
  • 原文地址:https://www.cnblogs.com/lonelyisland/p/14381781.html
Copyright © 2020-2023  润新知