zoukankan      html  css  js  c++  java
  • 【剑指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:bzhou84@163.com 
    **********************************/  
    #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
    "); 
            else 
                printf("No
    ");
        }  
        return 0;  
    }  
    /**************************************************************
        Problem: 1384
        Language: C++
        Result: Accepted
        Time:850 ms
        Memory:5356 kb
    ****************************************************************/

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

  • 相关阅读:
    使用Audio API设计绚丽的HTML5音乐播放器
    使用HTML5 WebDataBase设计离线数据库
    使用HTML5 WebStorage API构建与.NET对应的会话机制
    两步让你的mobile traffic通过fiddler代理传送
    前端开发梦中景象-支持手机上任何移动浏览器网页开发设计调试
    诸葛亮家书及名句
    BEM,SASS,LESS,bootstrap:如何有效地将这些方法,工具和框架聪明地整合?
    css best practice for big team and project
    angularJS directive中的controller和link function辨析
    一张图看懂CSS cascade, specific, importance, inheritance
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7096452.html
Copyright © 2011-2022 走看看