1. 程式人生 > >二維數組中的查找——牛客劍指offer

二維數組中的查找——牛客劍指offer

劍指offer 比較 direct [] data- ring 要求 als 步驟

題目描述:

在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。

輸入參數:target(查找值) array(二維數組)

解題思路:

1、python代碼

python實現比較簡單,使用for in循環取出數組的每行i,然後使用in操作符判斷target是否在行i中

1 # -*- coding:utf-8 -*-
2 class Solution:
3     # array 二維列表
4     def Find(self, target, array):
5 # write code here 6 for i in array: 7 if target in i: 8 return True 9 return False

2、java代碼

我們先看一個符合題目要求的數組

技術分享圖片

數組特點:每行元素滿足從左向右增大,每列元素滿足自上而下增大

同行不同列的數值存在確定的大小關系,同列不同行的數值存在確定的大小關系,數值減小的方向為:向上或向左(數值增大的方向:向下或向右)

需要註意,不同行不同列的數據間並無確定的大小關系。例如:a[1][0]>a[0][0],但是a[1][0]<a[0][2]。

考慮到數組的最後一行每一個元素均為列最大值,我們從最後一列開始查找:

算法(遞歸):

m:行數 n:列數

(1)遍歷最後一行(rowindex=m-1),找到第一個大於target的元素,存儲其列索引colindex

(2)向上搜索:find(rowindex,colindex,"up",target,array)

(2)遞歸

  a.當前操作為向上搜索(direction=‘up‘):

    如果rowindex==0:已經搜索至第一行,無解,返回false

    否則,rowindex-=1

  b.當前操作為向右搜索(direction=‘right‘):

    如果colindex==n-1:已經搜索至最後一列,無解,返回false

    否則,colindex+=1

  a.如果array[rowindex][colindex]==target:返回true

b.如果array[rowindex][colindex]>target:向上搜索find(rowindex,colindex,"up",target,array)  

  c.如果array[rowindex][colindex]<target:向右搜索find(rowindex,colindex,"right",target,array) 

按照如上算法和數組,舉例說明,搜索元素12步驟如下:

(1)m=4,n=4.最後一行第一個大於12的元素為13,存儲其行列索引,rowindex=3,colindex=2

(根據數值大小排列的特點,可以排除掉第一列和第二列的所有元素)

技術分享圖片

(2)向上搜索:find(rowindex=3,colindex=2,direction="up",target=11,array)

(3)遞歸:

向上搜索:rowindex=2,colindex=2,10<12:向右搜索

技術分享圖片

向右搜索:rowindex=2,colindex=3,13>12:向上搜索

技術分享圖片

向上搜索:rowindex=1,colindex=3,12=12:停止搜索,返回true

代碼如下:

 1 public class Solution {
 2     public boolean Find(int target, int [][] array) {
 3         int m=array.length;
 4         int n=array[0].length;
 5         int colindex=-1;
 6         int rowindex=m-1;
 7         for(int i=0;i<n;i++){
 8             if(array[m-1][i]>target){
 9                 colindex=i;
10                 break;
11             }
12             else if (array[m-1][i]==target){
13                 return true;
14             }
15         }
16         if(colindex==-1){
17             return false;
18         }
19         else{
20             return find(rowindex,colindex,"up",target,array);
21         }
22     }
23     
24     public boolean find(int rowindex,int colindex,String direction,int target, int [][] array){
25         if(direction=="up"){
26             if(rowindex==0){
27                 return false;
28             }
29             else{
30                 rowindex--;
31             }
32         }
33         else if(direction=="right"){
34             if(colindex==array[0].length-1){
35                 return false;
36             }
37             else{
38                 colindex++;
39             }
40         }
41         if(array[rowindex][colindex]<target){
42             return find(rowindex,colindex,"right",target,array);
43         }
44         else if(array[rowindex][colindex]>target){
45             return find(rowindex,colindex,"up",target,array);
46         }
47         else{
48             return true;
49         }
50     } 
51 //測試代碼
52 //    public static void main(String[]args){
53 //      int array1[][]={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
54 //      Solution sol=new Solution();
55 //      boolean a=sol.Find(14,array1);
56 //      System.out.println(a);
57 //    }
58 }

二維數組中的查找——牛客劍指offer