二維陣列中的查詢——牛客劍指offer

Darlin_F發表於2018-07-19

題目描述:

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

輸入引數:target(查詢值) array(二維陣列)

解題思路:

1、python程式碼

python實現比較簡單,使用for in迴圈取出陣列的每行i,然後使用in操作符判斷target是否在行i中

 # -*- coding:utf-8 -*-
 class Solution:
     # array 二維列表
     def Find(self, target, array):
         # write code here
         for i in array:
            if target in i: 
                 return True
         return False

2、java程式碼

我們先看一個符合題目要求的陣列

演算法(遞迴):

   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

 程式碼如下:

public class Solution {
    public boolean Find(int target, int [][] array) {
        int m=array.length;
        int n=array[0].length;
        int colindex=-1;
        int rowindex=m-1;
        for(int i=0;i<n;i++){
            if(array[m-1][i]>target){
                colindex=i;
                break;
            }
            else if (array[m-1][i]==target){
                return true;
            }
        }
        if(colindex==-1){
            return false;
        }
        else{
            return find(rowindex,colindex,"up",target,array);
        }
    }
    
    public boolean find(int rowindex,int colindex,String direction,int target, int [][] array){
        if(direction=="up"){
            if(rowindex==0){
                return false;
            }
            else{
                rowindex--;
            }
        }
        else if(direction=="right"){
            if(colindex==array[0].length-1){
                return false;
            }
            else{
                colindex++;
            }
        }
        if(array[rowindex][colindex]<target){
            return find(rowindex,colindex,"right",target,array);
        }
        else if(array[rowindex][colindex]>target){
            return find(rowindex,colindex,"up",target,array);
        }
        else{
            return true;
        }
    } 
//測試程式碼
//    public static void main(String[]args){
//      int array1[][]={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
//      Solution sol=new Solution();
//      boolean a=sol.Find(14,array1);
//      System.out.println(a);
//    }
}

 

相關文章