二维数组中的查找——牛客剑指offer

题目描述:

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

输入参数: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);
//    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值