讲座嘉宾:Stevenode
讲座连接:ACM大神精讲最新北美Google Facebook面试题面试
讲座总结:6Kunnnnn算法
题目介绍编程
其实这道题目就是五子棋的规则,条件就是横竖或者对角线知足5个一样棋子,很好理解。数组
题目分析数据结构
首先,咱们能想到的就是暴力枚举法,也就是枚举棋盘上各个棋子,判断是否可以知足条件。每一个棋子有8个方向,可是咱们须要除去冗余的枚举,只考虑4个方向就行了。以下图:ide
那么,咱们须要一个数组处理方向,以下图,其中d(k)就是用来表达方向的数组,注:下图中 d(2) = (1, -1) 应该为 d(3) - (1, -1) 即lower-left的方向post
那么给定点(x, y),和方向(dx[k], dy[k]),在这个方向上的第N个棋子就是 (x + dx[k] * N, y + dy[k] * N),以下图:学习
如今有了知道一个棋子某个方向上某个点的位置的方法,咱们就能够判断对于任意棋子的4个方向上,是否有知足条件的状况。对于最后的输出结果,咱们要判断对于黑白两种棋子,是否分别存在知足条件的状况。以下图:优化
因此总结起来,咱们须要枚举每一个棋子的四个方向上,每个可能位置,并检查是否成立,这个算法的复杂度是N方,由于须要对每个棋子都进行判断。以下图:
代码实现
以下图,valid(x, y) 判断棋子位置是否合法,也就是不能超过棋盘的范围,好比这道题目中棋盘长和宽都是15。
算法优化
如上图,暴力解法虽然直白,可是复杂度不尽人意。好比若是不是五子棋,而是M子棋,时间复杂度就会变大。如何优化呢?首先要了解暴力解法的弊端是什么:简单来讲,就是存在有些棋子被重复判断的状况。而有一种更好方法是,从各个方向上判断是否存在某一颜色的棋子成立M行的状况。以下图,咱们假定仍是五子棋的状况,即M=5,给定某个点的坐标(x, y),方法Black(x, y)用来判断从(x, y)这个点对于横行向右的方向上,连续黑色棋子的个数,具体实现以下图,是经过递归来完成,isBlack(x, y)用来判断(x, y) 坐标是否为黑子,是则返回1不然0。同理White和isWhite方法。
该算法的实现以下图:Step1,枚举每个方向,而不是棋子自己;Step2,逆向枚举每一个方向上的棋子,即x和y都是从N到1;Step3,用递归的方法来计算某个方向上的不一样颜色的棋子个数;Step4,只有这步和以前的暴力解法同样,判断最终的结果。算法最终复杂度为N方,不涉及M的参与。
题目介绍
给出一个最小堆的中序遍历,来生成这个最小堆,而且输出它的前序遍历的结果。输入就是,一个Int数组来存储中序遍历最小堆的结果,好比7 6 8 1 3 11,输出就是打印出这个最小堆的前序遍历,就是1 6 7 8 3 11。
题目分析
先来回顾一下Heap的性质。Heap在结构上是一个二叉树,所谓的最小堆Min-Heap,就是指从root节点开始,parent节点的值永远小于child节点。既然Heap是一种树,那么固然存在各类顺序的遍历traversal。总的来讲,不管是In-Order仍是Pre/Post-Order,这里的Order对应的是root/parent节点的Order,好比中序遍历是指先left-subtree,而后root,最后right-subtree。
既然root节点的值确定比其余节点要小,也就是这个数组中的最小值1。以后,根据中序遍历的规律,root的左子树在root前边先被遍历,右子树则恰好相反。那咱们知道了root节点为1后,就能够判断,在1前边就是这个堆的左子树,后边的就是右子树。以下图:
这道题目是一道递归题,考查的是分治思想Divide & Conquer,就是把以前的大问题,转化成若干性质相同的小问题,而后找到小问题的答案,最后将答案合并到一块儿就是大问题的答案。对于此题,最初的大问题就是最开始的input 7 6 8 1 3 11,而咱们上边所讲的,先找到root,再找到左右子树,而后对左右子树递归,这里“左右子树分别递归”就是被分解成的小问题。因此对于此题,咱们能够分解为三个步骤,以下图:
那么这种算法的时间复杂度是多少?首先,对于分治思想,一个很重要的概念就是层Level,能够理解为是将大问题分解成小问题所须要的次数,等价于树的高度Height,而对于树Tree来讲,高度是一个很重要的性质。因此对于此算法,咱们须要考虑将大问题分解成小问题的层数,也要考虑每一层的计算次数。以下图:
假定输入里有N个元素的话,对于每一层来讲,都须要找到最小node,这须要O(N)的复杂度。对于层数,平均状况是logN层,就是这个树是左右对称的。而最坏状况是N层,就是这个Tree实际上是一个chain,好比下图:
代码实现
算法优化
其实对于这个题目,咱们能够避免建立Min-Heap,而是直接把结果打印出来,以下图:
而如何避免最坏状况的发生?能够用RMQ,Range Minimum Query这个数据结构。感兴趣的同窗能够自学一下。
这是一道DP的题目,颇有难度,欢迎各位去观看原视频内容!
设立于硅谷,专一于编程、数据分析、UIUX设计的在线学习平台:BitTiger。