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)

  • 相关阅读:
    技术文章应该怎么写?
    后退时保存表单状态
    [原]长表头表格 竖直仅滚动内容区 水平滚动表头和内容区
    IE7不经提示关闭浏览器窗口
    meta 标记
    demo : 简单的 xslt 递归解析 xml 成 tree
    使用iframe和table模拟frameset的resize功能.html
    一个下划线(_)引发的"疑难杂症"
    几点小东西
    使用 ActiveReports 的 subReport 几点疑惑
  • 原文地址:https://www.cnblogs.com/Justdocument/p/12388669.html
Copyright © 2011-2022 走看看