随笔分类 - 博客 面试题:O(n)时间解决问题
摘要:问题描述 一个数组或者一个字符串,比如12345循环移动一位就是23451,再循环移动一位就是34512,问循环移动m位之后,数组或者字符串变成什么样 分析问题 首先我们需要弄明白一个问题,那就是循环移动m位和循环移动m%n位是一样的 我们可以不断地循环移动,每次将数组中的元素右移一位,循环m%n次,那么时间复杂度为n^2 RightShift(int* ...
阅读全文
摘要:问题描述 给定n*n的01方阵,每一行都是降序排列,即先前的一段一定是1,到10分界处之后才是全0,求1最多的那行中1的个数 分析问题 如果数出每一行1的个数,然后再看哪一行1的个数最多,这样时间复杂度是O(n^2) 如果用二分法优化,可以找出每一行0和1的分界处,然后就知道了每一行的1的个数,时间复杂度为nlogn 还有一种时间复杂度为n的方法,算法的策略师如...
阅读全文
摘要:leetcode 152 问题描述 给定一个数组,求最大的连续子数组乘积最大 分析问题 跟求和最大子数组类似,我们也可以用动态规划来解这道题,解题之前我们需要考虑是否存在溢出,在不存在溢出的情况下我们需要记录之前乘积的绝对值,这里因为有正负性,负负得正,所以我们需要记录之前乘积的最大值和最小值两个值 算法实现 int maxProduct...
阅读全文
摘要:leetcode11 问题描述 一个数组a[i]表示数轴上i的位置有一条高度为a[i]的竖直线段,把两条线段当作一个容器左右边的高度,问,哪两条线段组成的容器容积最大。 分析问题 本质是求i& height){ int best=0; int n=height.size(); for(int i=0,j=n-1;i<j;){ best=max(best,min(...
阅读全文
摘要:问题描述 如下图所示,给定一个数组[0,1,0,2,1,0,1,3,2,1,2,1],对应每个轴上的高度,求能积水的水量 分析问题 每一块水域的高度等于它左边最大值和右边最大值中的最小值。 解决问题 class solution{ public: int trap(vector &A){ int n=A.size(); int result=0...
阅读全文
摘要:问题描述 有n个人他们之间认识与否用邻接矩阵表示(1表示认识,0表示不认识),并A认识B并不意味着B认识A,也就意味着是个有向图 如果一个人是名人,他必须满足两个条件,一个是他不认识任何人,另一个是所有人必须都认识他。 分析问题 首先,我们从中可以分析出,名人必定最多只有1个,因为如果有两个名人AB,那么你说他们俩是否认识呢,考虑A是名人,那么B必定认识A,得出B必定...
阅读全文

浙公网安备 33010602011771号