zoukankan      html  css  js  c++  java
  • 二维数组中的查找

    题目描述

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

    思路一:

      把二维数组看成二叉树,左下角的的树就是中点,小于target往上走,大于target往右走。其实就是一棵二叉查找树。

    代码实现:

     1 public class Solution {
     2     public boolean Find(int target, int [][] array) {
     3         if(array == null || array.length == 0|| array[0] == null || array[0].length == 0){
     4             return false;
     5         }
     6         int len = array.length-1;
     7         int len2 = array[0].length-1;
     8         if (array[0][0] > target)
     9             return false;
    10         if (array[len][len2] < target)
    11             return false;
    12         int i = len;
    13         int j = 0;
    14         while (i >= 0 && j <= len2){
    15             if (array[i][j] == target){
    16                 return true;
    17             }else if (array[i][j] < target){
    18                 j++;
    19             }else{
    20                 i--;
    21             }
    22         }
    23         return false;
    24         
    25     }
    26 }

    思路二:

      用二分查找,把矩阵看成上三角和下三角,分别进行二分查找。

    代码实现:

     public static boolean Find(int [][] array,int target) {
            if(array == null || array.length == 0 || array[0] == null || array[0].length == 0){
                return false;
            }
            int low,high,mid;
            for(int j = 0; j < array.length; j++){
                low = j;
                high = array.length - 1;
                mid = (low + high) / 2;
                while(low <= high){
                    System.out.println(array[mid][j]);
                    if(array[mid][j] == target){
                        return true;
                    }
                    if(array[mid][j] > target){
                        high = mid - 1;
                    }else{
                        low = mid + 1;
                    }
                    mid = (low + high) / 2;
                }
            }
    
            for(int i = 0; i < array.length - 1; i++){
                low = i + 1;
                high = array[i].length -1;
                mid = (low + high) / 2;
                while(low <= high){
                    System.out.println(array[i][mid]);
                    if(array[i][mid] == target){
                        return true;
                    }
                    if(array[i][mid] > target){
                        high = mid - 1;
                    }else{
                        low = mid + 1;
                    }
                    mid = (low + high) / 2;
                }
            }
    
            return false;
        }

    顺序查找就不推荐了。

      

  • 相关阅读:
    HTML-参考手册: HTTP 状态消息
    HTML-参考手册: HTML 语言代码
    HTML-参考手册: URL 编码
    HTML-参考手册: HTML 符号实体
    HTML-参考手册: HTML ISO-8859-1
    HTML-参考手册: HTML ASCII
    HTML-参考手册: HTML 字符集
    HTML-参考手册: 颜色混搭
    HTML-参考手册: HTML 拾色器
    HTML-参考手册: HTML 颜色名
  • 原文地址:https://www.cnblogs.com/Kunrong/p/8689263.html
Copyright © 2011-2022 走看看