剑指offer(1)之二维数组中的查找

题目:

在一个 n * m 的二维数组(每个一维数组的长度相同)中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
 
方法一:暴力法:
    思路:用两个for循环遍历整个二维数组,一一比对,找到该整数返回true,没有找到返回false
    代码如下
        
 1 public class Solution {
 2     public boolean Find(int target, int [][] array) {
 3         for(int i=0;i<array.length;i++)
 4         {
 5             for(int j=0;j<array[i].length;j++)
 6             {
 7                 if(array[i][j]==target)
 8                 {
 9                     return true;
10                 }
11             }
12         }
13         return false;
14     }
15 }
 
方法二:左下查找法:
    思路:题目关键语句,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。那么这么一个二维数组的举例
[
  [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]
]
[
  [1]
]

    那么在二维数组左下角的元素,例如18,为该列最大的元素,该行最小的元素,我们每次确定m为这个数,

    每次和target进行比较

      每当target>m,说明target在m的右边,所以将m的值向右移

      每当target<m,说明target在m的上边,所以将m的值向上移

      每当target=m,说明target已经找到

    代码如下

        


  1. class Solution {
  2.     public boolean findNumberIn2DArray(int[][] array, int target) {
  3.      //进行数组长度的检查
  4.      int rows=array.length;
  5.         if(rows==0)
  6.             return false;
  7.         int cols=array[0].length;
  8.         if(cols==0)
  9.         {
  10.             return false;
  11.         }
  12.         int row=rows-1;
  13.         int col=0;
  14.     //开始查找该整数
  15.         while(row>=0 && col<cols)
  16.         {
  17.             if(target > array[row][col])
  18.             {
  19.                 col++;
  20.             }
  21.             else if(target < array[row][col])
  22.             {
  23.                 row--;
  24.             }
  25.             else
  26.             {
  27.                 return true;
  28.             }            
  29.         }
  30.         return false;
  31.     }
  32. }
 
 
原文地址:https://www.cnblogs.com/quxiangjia/p/12507691.html