牢骚&安利题目

来源:互联网 发布:windows有必要更新吗 编辑:程序博客网 时间:2024/05/03 14:28

感觉自己越来越蠢了

  • 最近做leetcode的题,做一题卡一题。
  • 于是乎我就来安利几道题吧(就是我自己没想出来或者没写出来)。

84. Largest Rectangle in Histogram

题意描述
给出一个长度为n的非负整数序列A。Ai表示一个宽度为1,高度为Ai的矩形。现在这n个矩形全都下对齐地紧挨在一起,求整个图的最大矩形面积。

算法分析
具体就是用一个栈维护一个上升高度序列,当某个高度下降时,就逐个出栈并统计面积。
这题难点其实是在细节处理上。并不是说很容易就想到用栈去做,而是想到某一种数据结构去维护,但是怎么维护、怎么求解?我的话,也想过用栈,但没想到怎么做,于是乎最后我还是去找了一下discuss。。
时间复杂度:O(n)

85. Maximal Rectangle

就是上一题的强化版,从序列变成了矩阵。
方法就是枚举每一行,用上一题的方法求解即可。
时间复杂度:O(n^2)

164. Maximum Gap

题意描述
给出长度为n的乱序非负序列,问若将该序列变为有序序列,相邻两个数的最大差值是多少。要求在线性时间复杂度和空间复杂度下求解。

算法分析
我先说这题最重要的一个结论吧。(就是因为没想到这个啊结果我做不出来啊,果然智商低了)
设最大的数字是A,最小的数字是B,根据抽屉原理,我们可以知道排序后相邻两个数字差值的最大值p有:
p>=(AB)/(n1)
那么这题就可以在线性时间内求解了。
首先,我们将数值分为n-1段,数值i根据自己的大小就会放在第j段中。
j=(iB)/(n1)
根据我们前面的结论可以知道,差值的最大值一定不会出现在同一段的两个数字之间。
因此我们只需要维护每一段的最大值和最小值。最后答案一定是某一个有效段的最小值与其前一个有效段的最大值的差值。
所谓有效段,即使说该段中存在数字,因为很可能有很多段中是并没有数字的。
时间复杂度:O(n)

324. Wiggle Sort II

题目描述
给出一个乱序序列nums,我们需要将里面的元素进行位置变换,使得:nums[0] < nums[1] > nums[2] < nums[3]……

Example:(1) Given nums = [1, 5, 1, 1, 6, 4], one possible answer is [1, 4, 1, 5, 1, 6].(2) Given nums = [1, 3, 2, 2, 3, 1], one possible answer is [2, 3, 1, 3, 1, 2]. 

题目保证有解,要求是用O(n)的时间,O(1)的额外空间求解。

牢骚
这题似乎可以不断的贪心+分类讨论求解。但是我想了很久都没有想得很明白,细节太多了。对每种情况讨论的过程中又会衍生新的情况和问题。总之剪不断理还乱。
于是乎我把这题安利给的xy同学。xy大腿用什么快选中位数+什么函数映射的方法似乎做出来了。但是他跑得特别慢,比用O(nlogn)排序再开O(n)空间生成新序列都慢得多。他的理由是那个函数映射怎么怎么太慢了。。
于是乎这题就死了。

0 0
原创粉丝点击