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

0 题目

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列按照从上到下递增顺序排序

请完成一个函数,输入这样一个二维数组和一个整数,判断数组中是否含有这个整数。

1 分析

凡是数组有序的首先要想到的是二分查找。

这个二维数组的特点在于,数组中某个点,在该点,右、下方的数都比该数大。左、上的都比该数小。

但是同时判断两个相同维度,比较麻烦。

因此先判断两个不同的维度。也就是说,判断某个点右面和下面,或是左面和上面。那么其中一个方向是大的,另一个方向是小的。

以判断右面和下面为例:

去左上的点开始,首先,如果目标数比当前点大,那么向下移动,如果比目标点小,那么向右面移动,此时点的右下就是带选择的区域,坐下就是筛选过的区域

bool find(int target, vector<vector<int>> array)
{
    size_t rows = array.size();
    if (rows == 0)
    {
        return false;
    }
    size_t cols = array[0].size();
    if (cols == 0)
    {
        return false;
    }

    // col,和row 是右上的点
    int col = cols - 1;
    int row = 0;

    // 点向左下移动,因此,col>=0, row < rows
    while (col >= 0 && row < rows)
    {
        if (target == array[row][col])
        {
            return true;
        }
        else if (target < array[row][col]) // 大于,向下移动
        {
            --col;
        }
        else if (target > array[row][col]) // 小于,向左移动
        {
            ++row;
        }
    }
    return false;
}

  

原文地址:https://www.cnblogs.com/perfy576/p/8560325.html

时间: 2024-10-15 19:34:06

剑指offer-3.二维数组中查找的相关文章

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

题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 分析: 首先选择数组中右上角的数字.如果该数字等于要查找的数字,查找过程结束:如果该数字大于要查找的数字,剔除这个数字所在的列:如果该数字小于要查找的数字,剔除这个数字所在的行.依次类推,直到查找范围为空. 示例程序: #include <stdio.h> #include <stdlib.h> int

剑指OFFER之二维数组中的查找(九度OJ1384)

题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数. 输入的第二行包括一个整数t(1<=t<=1000000):代表要查找的数字. 接下来的m行,每行有n个数,代表题目所给出的m行n列的矩阵(矩阵如题目描述所示,每

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

题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 解法一 利用二位数组有序的特性,首先选取数组中右上角的数字.如果该数字等于要查找的数字,查找过程结束:如果该数字大于要查找的数字,剔除这个数字所在的列:如果该数字小于要查找的数字,剔除这个数字所在的行.也就是说如果要查找的数字不在数组的右上角,则每一次都在数组的查找范围中剔除一行或者一列,这样每

[剑指Offer]5.二维数组中的查找

题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路 [算法系列之三十三]杨氏矩阵 代码 /*--------------------------------------- * 日期:2015-07-19 * 作者:SJF0115 * 题目: 5.二维数组中的查找 * 网址:http://www.nowcoder.com/books/coding-interviews/a

《剑指Offer 1.二维数组中的查找》2019-03-25

剑指Offer  第一题 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 本人简单的解题思路  就是通过二重循环,遍历.查找数组中是否有目标数字,思路是简单的,但是有个小坑 ,就是没有进行数组越界判断 少判断了  array = [ [ ] ] 这种情况,最终通过的代码为 public class Solution { public bool

剑指offer(2) - 二维数组中的查找

题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上往下递增的顺序排序.请写一个函数,输入一个二维数组和一个整数,判断数组中是否含有该整数. 例如下面的二维数组就是每行.每列都是递增顺序,如果在这个数组中查找数字7,则返回true,如果查找数字5,由于数组中不含有该数字,则返回false. 1   2   8   9 2  4   9   12 4  7  10   13 6  8   11   15 public class FindFromMatrix { priv

剑指OFFER之二维数组中的查找

题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数. 输入的第二行包括一个整数t(1<=t<=1000000):代表要查找的数字. 接下来的m行,每行有n个数,代表题目所给出的m行n列的矩阵(矩阵如题目描述所示,每

剑指offer系列——二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数

题目:二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数 分析: 二维数组这里把它看作一个矩形结构,如图所示: 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 在做这道题的时候我最先考虑的是每次比较对角线上的元素可能可以取得较好的效果, 以查找9为例, 从1(0,0)开始,1<10,可以得出结论,10在1的右侧或下侧: 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 然后看4(1,1),4<9, 1 2 8 9 2

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

题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 自己的思路实在是傻×了,先看下正确思路吧 把当前数字定位在第一行,最后一列.如果数字小则增大行,如果数字大则减小列!O(M+N) bool Find3(vector<vector<int> > array,int target) { if(array.empty() && array[0].

《剑指Offer》二维数组中的查找

二维数组中的查找 题目描述:在一个二维数组中,每个一维数组的长度相同,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:选取二维数组的右上角元素, 如果元素大于target(表示输入的那个整数),则删除整列: 如果元素小于target,则删除整行. 循环的条件:遍历完二维数组中的元素后,仍然找不到target值,循环停止.则,对于row行,从上0开始递增,执行for循环的条件是小于行的长度: