zoukankan      html  css  js  c++  java
  • 剑指offer 面试题4.二维数组中的查找

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


    本文通过对重要条件:

    每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序”的理解逐步进行优化。


    1.暴力搜索

    不考虑两个递增的特性,直接对该二维数组进行行列搜索。

    时间复杂度取决于数组的大小,O(n²)

    代码两层for循环即可。

    2.二分简单优化

    只利用行有序的条件,对行进行二分查找。

    可将时间复杂度降低到O(nlogn)

    代码在第一种情况下将内层for循环改成二分查找即可。

    3.从右上角或者左下角(对书中解法的理解)

    我最开始的想法就是从左上角开始进行一种,类似于dfs的解法。

    很明显,看过书中解法之后,远没有书中的解法来的巧妙。

    可以通过生活中做数独的例子,去理解书中的解法。

    0)从右上角开始,将当前数字temp同待查询数字x比较。

    ​ 0.1)如果x == temp 找到该数字结束

    ​ 0.2)如果x > temp,已知temp为该行最大数字,故排除整行,将temp设为该列第二个数字,回到0

    ​ 0.3)如果x < temp,已知temp为该列最小数字,故排除整列,将temp设为刚行第二个数字(倒数第二个),回到0

    这个思路是通过深刻理解题意,巧妙的利用题目的条件解出来的。时间复杂度降低到了O(n)

  • 相关阅读:
    HDU2586 How far away?(tarjan的LCA)
    You Raise Me Up
    POJ2891 Strange Way to Express Integers(中国剩余定理)
    POJ2142 The Balance(扩展欧几里得)
    HDU 1166模仿大牛写的线段树
    NetWord Dinic
    HDU 1754 线段树裸题
    hdu1394 Minimum Inversion Number
    hdu2795 Billboard
    【完全版】线段树
  • 原文地址:https://www.cnblogs.com/Justdocument/p/12388669.html
Copyright © 2011-2022 走看看