最近在折腾企业微信机器人的时候遇到了点问题,记录一下。
暴力的方法是使用递归一层一层计算所有的路径,这个一定会超时。使用动态规划将其转化为多个子问题,可以完美解决
需要在每一个右括号处判断是否有可以闭合的左括号
和之前的最接近三数之和的解法差不多,多了重复值的判断
需要找出当前数组的排排列,使用了字典序法。 假设数组有n个元素,找出从右往左满足第 arr[i] > arr[i+1] 的元素 从 i+1 往后找到比 i+1 大的最小值 j。 交换 i, j 把 i 右边的元素做一个倒序。
这一题一开始我是想直接将单词的所有排列组合列出来,再进行匹配,结果很明显就超时了。 改成换成取字符串,因为单词的长度都是一样的,可以分割成和 words 里一样的数组,将words转成对象,value 是出现的次数,然后遍历 keys,减去字符串里出现的单词,如果最后所有的 key 都是 0,则将当前的索引加入结果。运行后的时间复杂度太大,虽然是 ac 了。 后来看题解好像可以使用滑动窗口的方式优化,运行速度马上就上去了 合并 串联所有单词的子串
合并 k 个有序链表我用了两种方法去解题,一种是每次都遍历 k 个链表的头结点,找出里面的最小值,然后放在一个新的链表里,这种方法比较耗时,每次需要 O(kN) 的时间复杂度。另一种是使用分治的方式,像归并一样两两合并,这样每合完一次就会减小 1/2K 次循环,最终只用 log2K 的时间复杂度。 合并 k个有序链表
贪婪与非贪婪