剑指Offer刷题day01

66 篇文章 0 订阅

题目:

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

[

  [1,2,8,9],
  [2,4,9,12],
  [4,7,10,13],
  [6,8,11,15]

]

给定 target = 7,返回 true。

给定 target = 3,返回 false。

解答:主要考虑是二分查找

    bool Find(int target,vector<vector<int>> array) {
        if (array.size() == 0 || array[0].size() == 0)return false;
        int l1 = array.size();
        int l2 = array[0].size();
        if (array[0][0] > target || array[l1 - 1][l2 - 1] < target)return false;
        int left = 0, right = l1 - 1, middle;
        while (left <= right) {
            middle = (left + right) / 2;
            if (array[0][middle] < target) {
                left=middle+1;
            } else if (array[0][middle] > target) {
               right=middle-1;
            } else {
                return true;
            }
        }
        int index;
        if(array[0][right]<target){
            index=right;
        }else{
            index=left;
        }
        left=0;right=l2-1;
        while(index>0) {
            while (left <= right) {
                middle = (left + right) / 2;
                if (array[middle][index] < target) {
                    left = middle + 1;
                } else if (array[middle][index] > target) {
                    right = middle - 1;
                } else {
                    return true;
                }
            }
            index--;
            left=0;
            right=l2-1;
        }
        return false;
    }

运行结果:

其他答案参考引用:(逐步遍历思想)

class Solution {
public:
    bool Find(vector<vector<int> > array,int target) {
       int m,n,x,y;
        m = array.size();//行数
        n = array[0].size();//列数
        x=m-1;y=0;//坐标定在左下角
        while(x>=0 && y<=n-1){
          if(target<array[x][y]){
                       x--;//遇小上移
                 }
          else if(target>array[x][y]){
                       y++;//遇大右移
                 }
          else {
               return true;
             }
      }
       return false;
    }
};

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值