剑指 Offer 04. 二维数组中的查找

 bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
        /*
        基本思路: 首先与主对角线上的元素比较,确定大致所在的行和列即可。
        */
        int n = matrix.size();  // 行的大小
        int m = matrix[0].size();  //列的大小

        int i = n < m ? n - 1 : m - 1;

        int num;
        bool flag = false;

        while (i >= 1) {
            if (target <= matrix[i][i] && target >= matrix[i - 1][i - 1]) {
                num = i;
                flag = true;
                break;
            }
        }

        if (flag) {
            for (int j = 0; j <= i; j++) {
                if (target == matrix[num][j]) {
                    return true;
                }   
            }
            for (int j = 0; j <= i; j++) {
                if (target == matrix[j][num]){
                    return true;
                }
            }
        } else {
            if (n == m) {
                return false;
            } else if (n > m) {
                for (int j = m - 1; j < n; j++) {
                    for (int k = 0; k < m; k++) {
                        if (target == matrix[j][k]){
                            return true;
                        }    
                    }
                }
            } else if (m > n) {
                for (int j = 0; j < n; j++) {
                    for (int k = n - 1; k < m; k++) {
                        if (target == matrix[j][k]){
                            return true;
                        }    
                    }
                }
            } 
        }
        return  false;

    }

但是超时了,QAQ 。

//每一行进行二分还是超时.
bool BinarySearch (vector <int> &rets, int m) {
        int s = 0;
        int e = rets.size();
        while (s <= e) {
            int mid = (s + e) / 2;
            if (m > rets[mid]) {
                s = mid;
            } else if (m < rets[mid]) {
                e = mid;
            } else {
                return true;
            }
        }
        return false;
    }

    bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {

        for (int i = 0; i < matrix.size(); i ++) {
            if (BinarySearch(matrix[i], target)) {
                return true;
                break;
            }
        }  
        return false;
    }
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {

        for(int i = 0 ; i < matrix.size() ; i ++){
            for(int j = 0 ; j < matrix[0].size() ; j ++){
                if(matrix[i][j] == target){
                    return true;
                }
            }
        }
        return false;
    }
//不是吧,一个一个遍历就过了????
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {

        // for(int i = 0 ; i < matrix.size() ; i ++){
        //     for(int j = 0 ; j < matrix[0].size() ; j ++){
        //         if(matrix[i][j] == target){
        //             return true;
        //         }
        //     }
        // }
        if (matrix.size() == 0) {
            return false;
        }

        int m = matrix.size();
        int n = matrix[0].size();

        int row = 0, col = n - 1;

        while(row < m && col >= 0){
            if (target < matrix[row][col]) {
                col --;
            } else if (target > matrix[row][col]) {
                row ++;
            } else {
                return true;
            }
        }
                
            
        return false;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值