zoukankan      html  css  js  c++  java
  • 面试题目4:二维数组中的查找

    题不再难,在于优化

    这道题之前做过。

    题目是:

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

    之前自己做的时间复杂度略高。主要的思路是目标数是target,首先与二维数组的第一行最后一列的数比较,与target比较的数如果大于等于target,根据题目中数组的特性,说明有可能在这一行中,遍历这一行与target比较,如果有,返回true;如果没有在此行中,继续与下一行最后一列的数字比较,继续判断。代码如下:

     1 public static boolean Find(int target, int [][] array) {
     2              //从第一行开始
     3             for(int i=0;i<array.length;i++){
     4                 //从最后一列开始
     5                 int j = array[i].length-1;
     6                 //for(int j = array[i].length-1;j>=0;j--){
     7                     //如果最后一列的数比目标数大,就挨个与这一行的每个数进行比较。 
     8                     if(array[i][j] >= target){
     9                         for(int k:array[i]){
    10                             if(k==target){
    11                                 return true;
    12                             }
    13                         }
    14                     }
    15                 //}
    16             }
    17             return false;
    18         }

    最坏的情况,查找不到target时,时间复杂度为O(n^2).

    书中给出了更为优化的代码,时间复杂度为O(n),如下:

     1 public static boolean find0(int target, int [][] array){
     2          boolean Found = false;
     3          int row = 0;
     4          int column = array[0].length-1;
     5          
     6          if(array!=null && array.length >0 && array[0].length> 0){
     7              
     8             while(row < array.length && column >= 0){
     9                 if(array[row][column] == target){
    10                     Found = true;
    11                     break;
    12                 }else if(array[row][column]>target){
    13                     column--;
    14                 }else{
    15                     row++;
    16                 }
    17                 
    18             }
    19              
    20          }
    21          
    22          return Found;
    23      }


    主要是用了排除多余的行与列,缩小范围的方法。

    根据给出数组的特性,首先选取数组右上角的数字。如果该数字等于要查找的数字,则查找过程结束。如果该数字大于要查找的数字,则去除该数字所在列。如果该数字小于要查找的数字,则去除该数字所在行。这样逐步缩小范围,或者找到要查找的数字,或者查找范围为空。

    还是那句话,优化很重要。

  • 相关阅读:
    poj 3667 Hotel
    codevs 1380 没有上司的舞会
    bzoj 4033 树上染色
    bzoj 1179 [APIO 2009]Atm(APIO水题)
    poj 1741 Tree
    bzoj 3600 没有人的算术
    poj 3233 Matrix Power Series
    hdu 2256 Problem of Precision -矩阵快速幂
    [矩阵十题第七题]vijos 1067 Warcraft III 守望者的烦恼 -矩阵快速幂
    main函数递归
  • 原文地址:https://www.cnblogs.com/weiziqiang/p/8886563.html
Copyright © 2011-2022 走看看