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

    题目描述

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

    法一:两个for循环,o(n^2),直接查找。代码如下:

     1     public boolean Find(int target, int[][] array) {
     2         boolean flag = false;
     3         for(int i = 0; i < array.length; i++) {
     4             for(int j = 0; j < array[i].length; j++) {
     5                 if(target == array[i][j]) {
     6                     flag = true;
     7                     break;
     8                 }
     9             }
    10         }
    11         return flag;
    12     }
    View Code

    法二:外层for循环,内层二分,o(nlogn)。代码如下:

     1     public boolean Find(int target, int[][] array) {
     2         if(array.length == 0 || array[0].length == 0) {
     3             return false;
     4         }
     5         boolean flag = false;
     6         int left, right, mid, len = array.length;
     7         for(int i = 0; i < len; i++) {
     8             left = 0;
     9             right = len - 1;
    10             while(left <= right) {
    11                 mid = (right + left) / 2;
    12                 if(array[i][mid] < target) {
    13                     left = mid + 1;
    14                 }
    15                 else if(array[i][mid] > target) {
    16                     right = mid - 1;
    17                 }
    18                 else {
    19                     flag = true;
    20                     break;
    21                 }
    22             }
    23             if(flag == true) {
    24                 break;
    25             }
    26         }
    27         return flag;
    28     }
    View Code

    法三:一层for循环,o(n)。从左下角开始遍历,如果当前值<target,则向右走,如果当前值>target,则向上走。代码如下:

     1     public boolean Find(int target, int[][] array) {
     2         if(array.length == 0 || array[0].length == 0) {
     3             return false;
     4         }
     5         int i = array.length - 1, j = 0, len = array[0].length;
     6         boolean flag= false;
     7         while(i >= 0 && j < len) {
     8             //向右走
     9             if(array[i][j] < target) {
    10                 j++;
    11             }
    12             //向上走
    13             else if(array[i][j] > target) {
    14                 i--;
    15             }
    16             else {
    17                 flag = true;
    18                 break;
    19             }
    20         }
    21         return flag;
    22     }
    View Code
  • 相关阅读:
    什么是Referer?Referer的作用?空Referer是怎么回事?
    http状态码301和302详解及区别——辛酸的探索之路
    linux下redis的安装、启动、关闭和卸载
    Ubuntu下的redis安装过程
    apt-get build-dep命令详解
    apt 和 apt-get的区别
    Cortex-M3 入门指南(三):时钟总线与复位时钟控制器
    objdump命令解析
    ubuntu gcc 安装 使用
    你知道 GNU Binutils 吗?【binutils】
  • 原文地址:https://www.cnblogs.com/cing/p/8578986.html
Copyright © 2011-2022 走看看