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

下决心AC全部剑指offer面试题。

九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php

书籍:何海涛——《剑指Offer:名企面试官精讲典型编程题》

对于面试题,面试官往往更希望我们能提出优化方法,这样更能体现我们的思维能力以及传说中的“内功”。所以做剑指offer要着重训练这方面,多总结多细究,总是有优点的。加油~



题目链接地址:

http://ac.jobdu.com/problem.php?pid=1384

二维数组中的查找

时间限制:1 秒内存限制:32 兆 特殊判题:否提交:19005解决:3642

题目描写叙述:

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

输入:

输入可能包括多个測试例子,对于每一个測试案例,

输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数。

输入的第二行包括一个整数t(1<=t<=1000000):代表要查找的数字。

接下来的m行,每行有n个数。代表题目所给出的m行n列的矩阵(矩阵如题目描写叙述所看到的,每一行都依照从左到右递增的顺序排序,每一列都依照从上到下递增的顺序排序。

输出:

相应每一个測试案例。

输出”Yes”代表在二维数组中找到了数字t。

输出”No”代表在二维数组中没有找到数字t。

例子输入:

3 3

5

1 2 3

4 5 6

7 8 9

3 3

1

2 3 4

5 6 7

8 9 10

3 3

12

2 3 4

5 6 7

8 9 10

例子输出:

Yes

No

No



在九度OJ上提交通过剑指offer上的面试题3。

当我们须要解决一个复杂的问题时,一个非常有效的办法就是从一个详细的问题入手。通过分析简单详细的例子,试图寻找普遍的规律。

规律:

首先选取数组中右上角的数字。假设该数字等于要查找的数字。查找过程结束返回true;假设该数字大于要查找的数字。该列的元素肯定都大于要查找的数字,剔除这个数字所在的列;假设该数字小于要查找的数字,剔除这个数字所在的行。也就是说假设要查找的数字不在数组的右上角,则每一次都在数组的查找范围中剔除一行或者一列。这样每一步都能够缩小查找的范围,直到找到要查找的数字,或者查找范围为空返回fasle。



C++实现:

/*********************************
-----------------------------------
【剑指Offer面试题】二维数组中的查找
-----------------------------------
Author:牧之丶  Date:2015年
Email:[email protected]
**********************************/
#include <stdio.h>
#include <iostream>
using namespace std;
/*
二维数组matrix中查找是否有number
*/
bool Find(int* matrix, int rows, int columns, int number)
{
    bool found = false;

    if(matrix != NULL && rows > 0 && columns > 0)
    {
        int row = 0;
        int column = columns - 1;
        while(row < rows && column >=0)
        {
            if(matrix[row * columns + column] == number)
            {
                found = true;
                break;
            }
            else if(matrix[row * columns + column] > number)
                -- column;
            else
                ++ row;
        }
    }

    return found;
}

int main()
{
    int m,n;
    while(scanf("%d %d",&m,&n) != EOF)
    {
        int t,i;
        int matrix[1000*1000] = {0};
        scanf("%d",&t);
        for(i=0;i<m*n;i++)
            scanf("%d",matrix+i);
        bool result = Find(matrix,m,n,t);
        if(result)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}
/**************************************************************
    Problem: 1384
    Language: C++
    Result: Accepted
    Time:850 ms
    Memory:5356 kb
****************************************************************/


这里仅仅能用scanf printf输入输出,用cin cout測试为Time Limit Exceed不通过。

时间: 2024-10-07 06:29:28

【剑指Offer面试题】九度OJ1384:二维数组中的查找的相关文章

九度 1384 二维数组中的查找

#include<cstdio> #include<iostream> using namespace std; #define NMAX 1000010 int arr[NMAX]; /** * 只需要从左下角或右上角开始查找,即可. * 当是从右上角开始查找时, * 左上角(row = 0,column = columns - 1), * 1)若查找的值key大于当前的值arr[i],则说明key在此行以下,故有row++: * 2)若查找的值key小于当前的值arr[i],则

剑指offer——面试题38:数字在排序数组中出现的次数(利用二分查找来找第一次和最后一次的位置)

题目: 统计一个数字在排序数组中出现的次数. 思路: 因为是排好序的数组,所以可以采用二分查找的算法. 一般最容易想到的思路是采用二分查找先找到一个,然后往他左右两边遍历,但是这个方法由于在n个数组中还可能有n个k,所以 查找的复杂度还是O(n) 可以先用二分查找算法找到第一个出现的位置,即当找到一个时,看它前面一个是否也是k或者是否已经是查找这段的第一个了 然后同样用二分查找找最后一个出现的位置. 1 #include<iostream> 2 #include<vector> 3

剑指offer面试题38:数字在排序数组中出现的次数

题目描述: 统计一个数字在排序数组中出现的次数. 输入: 每个测试案例包括两行: 第一行有1个整数n,表示数组的大小.1<=n <= 10^6. 第二行有n个整数,表示数组元素,每个元素均为int. 第三行有1个整数m,表示接下来有m次查询.1<=m<=10^3. 下面有m行,每行有一个整数k,表示要查询的数. 输出: 对应每个测试案例,有m行输出,每行1整数,表示数组中该数字出现的次数. 样例输入: 81 2 3 3 3 3 4 513 样例输出: 4 //source:http

【剑指offer 面试题38】数字在排序数组中出现的次数

思路: 利用二分查找,分别查找待统计数字的头和尾的下标,最后做差加一即为结果. C++: 1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 5 int GetFirstK(vector<int>& nums, int startpos, int endpos, int k) 6 { 7 if(startpos > endpos) 8 return -1; 9 10 int

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

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

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

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

【剑指offer】面试题 4.二维数组中的查找

面试题 4. 二维数组中的查找 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 举例 例如下面的二维数组就是每行.每列都递增排列.如果在这个数组中查找数字7,则返回true;如果查找数字5,由于 数组不含有该数字,则返回false. 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 复杂度:O(M + N) + O(1) 代码实现 public

剑指offer 面试题(二维数组中的查找) (2)

面试题: 二维数组中的查找 /* 题目:   在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成 一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该数. */ ps:(其实前段时间我就做过这道题,今天看到了,觉得还是有点生,那就再来一次吧) 题目分析:  在分析这个问题的时候,我们首先要看,在一个二维数组中查找一个数字是否存在,那么很多人就觉得 简单了,遍历二维数组与所需要查找的数字进行比较不就完了!  不可否认的是你说的是可行的,可是

《剑指Offer》面试题:二维数组中的查找

题目 题目:在一个二维数组中,每一行都按照从左到右的顺序进行了排序,每一列都按照从上到下进行了排序. 输入这样的一个二维数组arr和一个整数k,判断数组中是否存在这个数. 思路 由于数组时有序的这样一个前提,因此 从右上角开始查找 :如果要查找的数比右上角的值大,则查找范围删除掉(并不是实际的删除,只需要改变下标即可)这一行,如果要查找的数比右上角的值小,则查找范围删除掉这一列:这样就可以将查找范围逐渐缩小,直至完成搜索 当然也可以从右下角开始查找,但是不可以从左上角或者是左下角开始查找(因为这