‘前言’

众所周知,对于面试而言,《《剑》指offer》是一本“‘好书’”。

若是你和我一样是个算法菜鸡, 那[么最推荐“的”是先把《剑》指offer“的”问题搞明了,其次再去刷LeetCode「等」习题,这样对于面试突击异常有用,由于面试官最常考“的”算法题都在这本书里。

若是你发现看这本书很吃力,可以先直接参考些网上“的”代码,〖照着抄一遍〗,明白下算法题是应该解题,多抄几道问题,你就对算法题“的”做法有感受了,这个高考做牢固套路数学题是一样“的”。

对于《剑》指offer<『《题解》』>这个 “系列”[,我“的”写作思绪是,对于看过文章“的”读者,「能够做到」:

  • 迅速领会该题常见解答思绪(奇技淫巧不包括在内,节约人人时间,着实有研究需求“的”人可以查阅其它资料)
  • 思绪只管贴近原书(例如书中提到“的”面试官经常会要求不改变原数组,或者有空间限制等,只管体现在代码中,保证读者可以不遗漏书中细节)
  • 只管精简话语,制止冗长注释
  • 给出代码可运行,注释齐全,关注细节问题
  • 代码能够通过牛客网在线编程《《剑》指offer》测试

《《剑》指offer<『《题解》』>》 “系列”[

<你可以通过以>下几种途径查看我“的”《《剑》指offer<『《题解》』>》 “系列”[:

  • 《关》注我“的”民众号:【后端手艺漫谈】,<点击民>众号导航栏:《剑》指offer<『《题解》』>
  • 《剑》指offer<『《题解》』>专栏(CSDN)
  • 各大博客平台我“的”账号(见本文最下方)

问题先容

在一个二维数组中(每个一维数组“的”长度相同),每一行都凭据从左到右递增“的”顺序排序,每一列都凭据从上到下递增“的”顺序排序。请完成一个函数,输入这样“的”一个二维数『组和』一个‘整数’,〖判断数组中是否含有该〗‘整数’。

解题思绪

方式一

首先能够想到“的”肯定是一行一行或者一列一列遍历,〖判断数组中是否含有该〗‘整数’。该方式显然是最拙笨“的”二维数组遍历,面试官也不会满足,“时间复”杂度是O(n^2)

代码

Python

class Solution:
    def Find(self, target, array):
        for i in range(len(array)):
            for j in range(len(array[0])):
                if array[i][j]==target:
                    return True
        return False

方式二

我们思索下,既然大“的”数字都在靠右边/下边,能否能行使行列“的”数据转变纪律来优化下解法,若是寻找“的”目“的”数《大于》现在“的”数字, 那[么目“的”数字是在当前位置“的”右边或下边,若是所寻找“的”目“的”数小于现在“的”数字, 那[么目“的”数字在当前位置“的”左边或上边。举个例子,如下图数组所示:

1  2  3   4
2  3  8   9
3  4  9   10
4  5  10  11

我们“的”位置是1,(要找)8,8《大于》1, 那[么在1“的”右边和下边区域举行下一步“的”{搜索}。

若是我们先{搜索}他“的”右边,

2  3   4
3  8   9
4  9   10
5  10  11

又{搜索}了他们“的”下边,

,

欧博allbet网址ALLbet6.com

欢迎进入欧博allbet网址(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团“的”官方网站。《欧博官网开放》Allbet注册、Allbe代理、Allbet 电[脑客户端、Allbet『手机版下载等业务』。

,
2  3  8   9
3  4  9   10
4  5  10  11

这时刻“我们发现”

3  8  9
4  9  10
5  10 11

这个区域{搜索}了两次,我们是从数组“的”第一个数[0][0]取“的”,遇到了重复{搜索}区域“的”问题。有没有方式去除重复“的”《搜》索区域呢,“我们发现”,当从右上角取第一个数“的”时刻,可以去除重复“的”{搜索}区域,还是以这个数组为例,取4,{搜索}8,发现8比4大, 那[么8不可能出现在4 这一[行,只需要从下边{搜索}即可。若是寻找3,3比4小,4那一列后续“的”数都《大于》4,只需要从左边{搜索}即可。

1  2  3   4
2  3  8   9
3  4  9   10
4  5  10  11

我们还可以发现左下角“的”点也可以去除重复{搜索}区域,总结起来“的”话,有点像变量控制法“的”感受,将一个变量控制住,凭据另外一个变量“的”纪律,“得出结论”。

这样我们将时间复杂度降为了O(n)

代码

Java

public class Solution {
    public boolean Find(int target, int [][] array) {
        int rows = array.length;
        int cols = array[0].length;
        int i = rows-1, j = 0;
        while(i >= 0 && j < cols){
            if(target < array[i][j])
                i--;
            else if(target > array[i][j])
                j++;
            else
                return true;
        }
        return false;
    }
}

Python

class Solution:
    def Find(self, target, array):
        if array == ([] or [[]]):
            return False
        row = len(array)
        col = len(array[0])
        i=0
        j=col-1
        while 0<=i<row and 0<=j<col:
            if target>array[i][j]:
                i=i+1
            elif target<array[i][j]:
                j=j-1
            else:
                return True
        return False

总结

问题简朴[,小伙伴们需要明白“的”是算法题应该注重“的”是效率优化,<暴力穷举能够解决问>题,但说服不了面试官。

我“的”《《剑》指offer<『《题解》』>》 “系列”[

你可以通过以下两种途径查看《《剑》指offer<『《题解》』>》 “系列”[:

  • 《关》注我“的”民众号:【后端手艺漫谈】,【点】击民众号下方:《剑》指offer<『《题解》』>
  • 《剑》指offer<『《题解》』>专栏(CSDN【导航】页)
  • 各平台博客

《关》注我

我是一名后端开发工程师。

主要关注后端开发,数据平安,“爬虫”,物联网,边缘盘算等偏向,迎接交流。

各大平台都可以找到我

  • {微信民众号}:【后端手艺漫谈】
  • Github:@qqxx6661
  • CSDN:@Rude3Knife
  • 知乎:@Zhendong
  • 简书:@蛮三刀把刀
  • 掘金:@蛮三刀把刀
  • 头条:@【后端手艺漫谈】

原创博客主要内容

  • Java知识点温习全手册
  • Leetcode算法题剖析
  • 《剑》指offer算法题剖析
  • SpringBoot菜鸟入门实战 “系列”[
  • SpringCloud菜鸟入门实战 “系列”[
  • “爬虫”相关手艺文章
  • 后端开发相关手艺文章
  • 逸闻趣事/‘好书’分享/“小”我私家兴趣

小我私家民众号:【后端手艺漫谈】


民众号:【后端手艺漫谈】.jpg

若是文章对你有辅助,不妨珍藏,投币,转发,在看起来~