剑指 Offer 04. 二维数组中的查找

题目

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

示例

在这里插入图片描述

解题思路

排好序的数组,二分查找

代码

package 剑指offer.查找问题.offer4;

public class Solution {

    public static void main(String[] args) {
        Solution solution = new Solution();
//        int[][] 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}
//        };

//
//        int[][] 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}};
                int[][] matrix = {{5}};



        int target = 5;

        solution.findNumberIn2DArray(matrix,target);

    }

    /**
     * 思路分析
     * 对于存在递增的序列,我们采用二分法进行查找
     *
     * 
     * 先对于纵坐标进行查找,查找到对应的值后,然后对于横向进行二分查找
     * 
     * 注意:纵坐标横向查找到了,但是0-查找到的top值区间的,数组都需要进行二分查找,看是否存在对应的值
     *
     * @param matrix
     * @param target
     * @return
     */
    public boolean findNumberIn2DArray(int[][] matrix, int target) {

        int height = matrix.length;
        int width = matrix[0].length;
        int top = findHeight(0, height-1, matrix, target);


        for (int i = 0; i <= top; i++) {
            boolean res = findX(0, width-1, matrix[i], target);
            if(res){
                return true;
            }
        }


        return false;
    }

    public int findHeight(int top,int bottom,int[][] matrix, int target){

        if(top >= bottom){
            return bottom;
        }


        int index = (top+bottom)/2;
        int indexNum = matrix[index][0];
        if(indexNum == target){
            return index;
        }

        if(indexNum < target){

            return  findHeight(index+1,bottom,matrix,target);
        }else{
            return  findHeight(top,index-1,matrix,target);
        }
    }


    public boolean findX (int left,int right,int[] matrix, int target){
        if(left > right){
            return false;
        }


        int index = (left+right)/2;



        int indexNum = matrix[index];

        if(indexNum == target){
            return true;
        }

        if(indexNum < target){
            return findX(index+1, right, matrix, target);
        }else{
            return findX(left,index-1,matrix,target);
        }


    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值