剑指offer——二维数组中的查找(三种方法实现)

本文探讨了在二维数组中查找目标元素的三种优化方法,包括遍历整个数组、从最后一行左上角开始查找及结合二分法的高效搜索策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

思路迭代

  • 第一次思考:循环整个数组 (254 ms 17652K)
  • 第二次思考:循环最后一行,从最后一行最左边的数开始,左下角的数字比较特殊,与target比较,比target大就向上走,比target小就向右走(181 ms 17580K)
  • 第三次思考:改进第二次思考,在向上走的时候用二分法 (171 ms 17460K)

代码展示

1

public class Solution {
   public boolean Find(int target, int [][] array) {
       for (int i=0;i<array[0].length;i++){
           for (int j = 0;j<array.length;j++){
               if (array[j][i] == target){
                   return true;
               }
           }
       }
       return false;
       }

   }

2

public class Solution {
   public boolean Find(int target, int [][] array) {
       int row_len = array.length;
       if (row_len == 0){
           return false;
       }
       int column_len = array[0].length;
       if (column_len == 0){
           return false;
       }
       if (target >= array[0][0] && target <= array[row_len -1][column_len -1] && (row_len != 0)&&(column_len != 0)){
           for (int i = 0; i < row_len;i++){
               if (array[i][column_len - 1] >= target){
                   for(int j = column_len -1; j >=0;j--){
                       if (array[i][j] == target){
                           return true;
                       }
                        
                   }
               }
           }
       }
       return false;
   }
}

3

public class Solution {
    public boolean Find(int target, int [][] array) {
        int row_len = array.length;
        if (row_len == 0){
            return false;
        }
        int column_len = array[0].length;
        if (column_len == 0){
            return false;
        }
        if (target >= array[0][0] && target <= array[row_len -1][column_len -1] ){
            for (int i = 0; i < row_len;i++){
                if (array[i][column_len - 1] >= target){
                    int low = 0;
                    int high = column_len -1;
                    int middle;
                    while( low <= high ){
                        middle = (low + high) /2;
                        if(array[i][middle] == target){
                            return true;
                        }
                        else if (array[i][middle] > target){
                            high = middle-1;
                        }
                        else {
                            low = middle+1;
                        }
                    }
                }
            }
        }
        return false;
    }
}

注意

  • 第二次的时候忘记考虑二维数组是空的情况,直接写了下面这样的代码,错误在于不一定有array[0]
int row_len = array.length;
int column_len = array[0].length;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值