最大的k个值(简单)
给一个数组返回最大的k个值,顺序不做要求。
于是上sort(),轻松完成。
值得一提的是:有位老铁和我讲可以用nth_element()。我惊呆了,还有这种操作?于是查了一下nth_element。可以说是很少用的一个函数了。
或许这些函数都是一个参数超级多的快速排序函数的不同封装吧?如果有大佬去研究过这个,还请解惑。
链表的第一个公共结点
给出两个链表头,求第一个公共结点。
这个问题要求了时间复杂度O(N),空间复杂度O(1)。在此之前,我听说过一个用栈解决的方法,然后满脑子都是从最后一个结点反推。好了,这么一来空间复杂度绝对只能是O(N)。于是去看题解,有一种是这么做的:
先求出两个链表的长度,然后将长链表较长的部分排除。这样两边链表同时遍历的时候就不会擦肩而过了(像极了试图与女神巧遇的我)。按照这种做法,第一遍结束后还可以加一个尾节点的比较——如果你和女神没有缘分的话就别搞巧遇了……
还有一种有意思的解法:如果你知道两条链表最终会相遇,也可以用三生三世的法子来碰,达到尾节点时重新回到头结点,最终,你和她会在同一个节点相遇。
小朋友,你应该有一个大大的问号:为啥能够相遇呢?拿好这个问号,我先讲一个别的题。
水壶问题
有两个水壶,一个能装a升水,一个能装b升水。现在我们需要c升水,能否准确地得到这c升水?
leetcode的用例居然还有不能装水的水壶……以及不需要水的用例,我服了。我们这里还是只谈论一般的情况。按照构造性的方法,我们应该上一个广度优先搜索(BFS),找到所有可以达到的情况。但这个思路实现起来很麻烦,跑的也特别慢。
这个时候,如果我说:有一种特别简单的方法,你可能会回想起前面的三生三世。没错,这两个问题是有联系的。这里有一个结论:
如果a与b的最大公因数能够整除c,就可以得到c升水。这是裴蜀定理的一个应用。
于是辗转相除美滋滋。
所以,三生三世自然是可行的。
什么?三生三世的最大公因数?如果你注意到了这个华点,我只能说:
假设这个公因数是x。显然我们可以把x次取下一个结点的操作视为一个单位操作。
找法官
有一个N个人的小镇与一系列单向信任关系(不包括自己信任自己)。小镇上如果有法官,他一定:不信任任何人;被其他任何人信任。找出这个法官。
只要统计这N个人的信任其他人的频次和被其他人信任的频次就行了。实际上,可以取一个差值:被信任次数-信任次数,只有法官可以使这个数据达到N-1。
下面是一个远为麻烦的问题。
取糖果
假设有很多盒子,有的盒子里还有盒子,有的盒子上了锁,而有的盒子里面有其他盒子的钥匙。盒子里都有一些糖果。现在你知道:
每个盒子有多少糖果;每个盒子的上锁情况;每个盒子里都有哪些钥匙;每个盒子里都有哪些盒子;开始的时候你可以操作哪些盒子。
求:最多能拿到多少糖果。
这个问题难点只是数据类型特别多,关系比较复杂,实际上也只有顺藤摸瓜这一种方法。要做出这个题,也只能理清关系:
可以操作的盒子->可以打开的盒子->获得物资->重复流程。
这个循环在没有可以打开的盒子的时候跳出。
官方答案是将可以打开的盒子组了一个队列,我没有用这个队列,而是每次得到新的盒子就会开启一次可以操作的盒子的遍历检查。这样确实慢了很多,多了很多打不开的盒子的重复检查,不如即时更新可以打开的盒子的方法好。