【剑指offer】二维数组中的查找☆

题目描述

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

自己的思路实在是傻×了,先看下正确思路吧

把当前数字定位在第一行,最后一列。如果数字小则增大行,如果数字大则减小列!O(M+N)

bool Find3(vector<vector<int> > array,int target)
    {
        if(array.empty() && array[0].empty())
            return false;

        int r = 0, c = array[0].size() - 1;
        while(r < array.size() && c >= 0)
        {
            if(array[r][c] == target)
                return true;
            else if(array[r][c] > target)
                c--;
            else
                r++;
        }
        return false;
    }

我自己二分查找的思路,每次扔掉一半O(log(MN)),超级繁琐,也AC了

bool Find(vector<vector<int> > array,int target) {
        if(array.empty() && array[0].empty())
            return false;

        //用四个变量标记剩余的查找范围
        int cleft = 0, cright = array[0].size() - 1;
        int rup = 0, rdown = array.size() - 1;
        int l, r, u, d;

        while(cleft <= cright && rup <= rdown)
        {
            //对限定区域的第一行进行二分查找,定位刚好小于target值的列
            l = cleft, r = cright;
            if(array[rup][l] > target) //所有的都大于target
                return false;
            else
            {
                while(l <= r)
                {
                    int m = l + (r - l) / 2;
                    if(array[rup][m] == target)
                        return true;
                    else if(array[rup][m] < target)
                        l = m + 1;
                    else
                        r = m - 1;
                }
                cright = r;
            }

            //对限定区域的第一列进行二分查找,定位刚好小于target值的行
            u = rup, d = rdown;
            if(array[u][cleft] > target) //所有的都大于target
                return false;
            else
            {
                while(u <= d)
                {
                    int m = u + (d - u) / 2;
                    if(array[m][cleft] == target)
                        return true;
                    else if(array[m][cleft] < target)
                        u = m + 1;
                    else
                        d = m - 1;
                }
                rdown = d;
            }

            //对限定区域的最后一行进行二分查找,定位刚好大于target值的列
            l = cleft, r = cright;
            if(array[rdown][r] < target) //所有的都小于target
                return false;
            else
            {
                while(l <= r)
                {
                    int m = l + (r - l) / 2;
                    if(array[rdown][m] == target)
                        return true;
                    else if(array[rdown][m] < target)
                        l = m + 1;
                    else
                        r = m - 1;
                }
                cleft = l;
            }

            //对限定区域的最后一列查找,定位刚好大于target值的行
            u = rup, d = rdown;
            if(array[d][cright] < target) //所有的都小于target
                return false;
            else
            {
                while(u <= d)
                {
                    int m = u + (d - u) / 2;
                    if(array[m][cright] == target)
                        return true;
                    else if(array[m][cright] < target)
                            u = m + 1;
                    else
                        d = m - 1;
                }
                rup = u;
            }
        }

        return false; //没找到
    }
时间: 2024-07-31 23:43:31

【剑指offer】二维数组中的查找☆的相关文章

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

题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. # -*- coding:utf-8 -*- class Solution: # array 二维列表 def Find(self, target, array): # write code here row=0 col=len(array[0])-1 while(row<len(array)

剑指offer—二维数组中找数

题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 基本思想: 首先选取数组中右上角的数字.如果=要找的数字,结束.如果大于要找的数字,剔除这个数字所在的列:如果小于要找的数字,剔除这个数字所在的行. #include <iostream> using namespace std; void find(int a[][4],int rows,int columns,int

剑指Offer_4_二维数组中的查找

题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 例 :     1   2    8     9 2   4    9    12 4   7   10   13 6   8   11   15 在这个数组中查找数字 9 ,  则返回true . 查找数子5 ,则返回false . 分析 : 因为二位数组每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺

剑指offer--1.二维数组中的查找

题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:从左下角开始寻找,如果小于target,就往右找,如果大于target就往上找. function Find(target, array) { var r = array.length; var c = array[0].length; var i = r-1; var j = 0; whil

C#版剑指Offer-001二维数组中的查找

题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.例如:下面的二维数组就是每行.每列都递增排序.如果在这个数组中查找数字7,则返回true:如果查找数字5,由于数组不含有该数字,则返回false. 解题思路 看到该题目想到的最简单暴力做的做法就是直接遍历数组查找.但是实际上一般都要用效率更高的做法,该题目有两个重要条件,从左到右递增,从上到下递增

剑指Offer1:二维数组中的查找

一:题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.二:解题思路:target值为要找的数<第1种>暴力搜索,两重for循环遍历.时间复杂度O(n^2)<第2种>从数组最右上或最左下开始.时间复杂度O(n)如图:右上: 如果target值小于当前数组的值,则只用将数组列减一:如果target值大于当前数组的值,则只用将数组行加一.左

剑指offer_02_二维数组中的查找

#include <iostream> using namespace std; bool ifHasNum(int *data,int row, int col, int num){ if(data == NULL || row <= 0 || col <= 0){ return false; } int i = 0; int j = col - 1; while(i < row && j >= 0){ if(num == data[i * col +

剑指offer-3.二维数组中查找

0 题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列按照从上到下递增顺序排序 请完成一个函数,输入这样一个二维数组和一个整数,判断数组中是否含有这个整数. 1 分析 凡是数组有序的首先要想到的是二分查找. 这个二维数组的特点在于,数组中某个点,在该点,右.下方的数都比该数大.左.上的都比该数小. 但是同时判断两个相同维度,比较麻烦. 因此先判断两个不同的维度.也就是说,判断某个点右面和下面,或是左面和上面.那么其中一个方向是大的,另一个方向是小的. 以判断右面和下面为例: 去左

剑指offer:二维数组的查找

题目:二维数组的查找 思路: 由于二维数组是从左到右,从上到下是递增的,所以可以从右上角或者左下角开始选择, 比如从右上角开始, 右上角的值都比目标值大的话,而右上角所在列的值都比右上角的值大,则所在列排除. 右上角的值都比目标值小的话,而右上角所在行的值都比右上角的值小,则所在行排除. 以此类推,查找会以行或者列的范围进行缩小.直到得到与目标值相同的值或者没有相同值. 图解: 而右上角所在列的值都比目标值大,则排除所在列. 有 图解: 代码: class Solution { public b

【剑指Offer面试题】二维数组中的查找

下决心AC所有剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> 对于面试题,面试官往往更希望我们能提出优化方法,这样更能体现我们的思维能力以及传说中的"内功".所以做剑指offer要着重训练这方面,多总结多细究,总是有好处的.加油~ 二维数组中的查找 时间限制:1 秒内存限制:32 兆 特殊判题:否提交:19005解决:3642 题目描述: 在一个