维护一个1000个节点的小顶堆。算法
时间复杂度O(nlogk)数组
具体步骤:(1)将k个数组的第一个元素取出来,维护一个小顶堆。app
(2)弹出堆顶元素存入结果数组中,并把该元素所在数组的下一个元素取出来压入队中。函数
(3)调整堆的结构,使其知足小顶堆的定义。编码
(4)重复(2)(3)直到合并完成。指针
动态规划:dp[n][m]表示n被分解为最大为m的数的方案数code
\[dp\left[ n \right]\left[ m \right] = \sum\limits_{k = 1}^{m - 1} {dp\left[ {n - m} \right]\left[ k \right]} \]排序
借助快排partition的思想,平均时间复杂度是O(n)递归
等价于求数组中第n/2大的数,和4中思想同样,平均时间复杂度O(n)leetcode
在一个二维数组中(每一个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路分析:咱们注意到这个二维数组的行和列都是升序的,也就是说最上面的一行和最右边的一列在总体上也是升序的,在一个排序数组上查找某个咱们会很天然的想起二分法。这样咱们每次都把要查找的数和当前剩下的二维数组的右上角数字比较,这样每次咱们均可以排除掉一行或一列。算法的时间复杂度是O(n+m),也就是行数加列数。
题一:替换空格(剑指offer)
请实现一个函数,将一个字符串中的每一个空格替换成“%20”。例如,当字符串为We Are Happy.则通过替换以后的字符串为We%20Are%20Happy。
题二:两个排序数组A1和A2,如今想把A2插入A1中并仍保持有序。
思路分析:数组是个顺序表,咱们往数组中插入某个数的话必需要移动当前位置后面全部的数。常规的思路是每次插入一个数并移动后面的数,这样屡次插入后会致使数组中有的数被移动了屡次,极大浪费了效率。咱们但愿每一个数移动一次就到达它最终的位置,因此咱们每每会反向移动数组,这样作的好处是移动当前数时后面的数已经到达了最终位置,咱们移动当前数不会影响到后面的数,这样就确保了每一个数只被移动一次。
归并排序的思想,用快慢指针不断二分链表。
斐波那契数列:f(0) = 0, f(1) = 1, f(n) = f(n - 1) + f(n - 2)
方法一:递归,效率低
方法二:循环,正着推
方法三:矩阵运算
解题思路:26进制转10进制。
解法1:右移原数判断,若是输入是负数可能陷入死循环。
解法2:左移1
解法3:把一个整数-1后与原数作与运算会消去原数最左边的1
把一个数组划分红两部分,使其方差和最小。
D(X) = E(x^2) - [E(X)]^2
迭代求和。
计算(1+((2+3)*(4*5))),leetcode224
解题思路:最大连续子序列的变种题,从前日后遍历一遍求最大连续子序列和,而后从后往前遍历一遍求最大连续子序列和。
思路拓展:对于删去中间一段很差直接操做的话,能够先从前日后遍历,在从后往前遍历。
解法: 先讨论能不能作完:每一个锅在t分钟内能作的饼数为min(mi,vi*t), 降序排列,前k个锅能作出来的饼>l就能; 若是不能作完:直接输出前k个锅能作饼的和;若是能:二分最短期,而后判断在mid分钟内能不能作完饼,判断方法同t分钟的状况。
思路:查询时先想一下二分。
解题思路:把该节点下个节点的值复制到该节点,删除下个节点(注意该节点是尾节点和链表只有一个节点的特殊状况)