树的层序遍历问题
从上到下
|
|
从下到上
|
|
之字形层序遍历
|
|
从一颗树右侧看过去的节点数
|
|
合并k个排序链表, 用优先队列,重写compare方法
|
|
找到数组中出现频率最高的k个数
|
|
黄小黄的幸福生活!
|
|
|
|
|
|
|
|
|
|
|
|
注意进位问题就好了。
|
|
|
|
由于给出的是要删除的节点,无法获取其上一个节点,因此将其下一个节点的值复制过来,删除其下一个节点。
|
|
|
|
|
|
设置dummy头节点,然后找到当前节点需要插入的位置。
|
|
百度二面遇到了,这个解法是设置dummy头节点,当时自己选择的是递归方法,比较好想。
|
|
快慢指针将链表分为两部分,对两部分进行继续拆分,然后返回其合并结果。复杂度为O(NlogN)。
|
|
创建两个dummy节点,最后两个连接起来就可以了。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
快慢指针定位,反转后半部分,然后逐一对比。
|
|
|
|
维持set的长度为K
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
模拟操作系统中堆栈,创建一个Command类,封装了一个string和treenode,string指定command执行的操作,treenode保存数据,则前中后遍历只需要调整很少的顺序就可以了。
中序遍历:
|
|
前序–这个没有改,用的经典算法:
|
|
后序:
|
|
|
|
|
|
|
|
|
|
堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。堆排序很适合在m个数中选择最大的k个数的问题。只需要进行k此调整就可以取出。
思路:
Java实现:
|
|
快速排序一般基于递归实现:
|
|
|
|
|
|
|
|
|
|
|
|
行,列,左右对角线
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
动态规划(英语:Dynamic programming,DP)是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 动态规划常常适用于有重叠子问题
和最优子结构性质
的问题,动态规划方法所耗时间往往远少于朴素解法。
动态规划问题,需要将给定问题分成若干个子问题,再合并子问题的解而得到原问题的解。通常许多子问题很相似,不同于递归方法,动态规划仅仅解决子问题一次,从而减少计算量:一旦某个子问题的解已经算出,则将其记忆化存储,以方便下一次需要同一个子问题解时直接返回。
动态规划需要满足的三个性质:
最优子结构性质:问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构性质。
子问题重叠问题:递归算法自顶向下对问题进行求解过程中,每次产生的子问题并不总是新问题,有些子问题会重复计算多次。
无后效性:各个阶段按照一定顺序排列好之后,对于某个给定的状态,它以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的状态。
递归算法的复杂度为2^n,而DP算法的时间复杂度为O(N),原因在于递归算法过程中存在着大量的重叠子问题,随着N增大,问题规模呈指数增长。也可以采用记忆化搜索,每次求子问题的解之前先取数组中查看该子问题是否已经解决,如果解决了直接返回,没有解决将结果添加到数组中。记忆化搜索是自顶向下的思考问题,而DP则是自底向上的思考问题。
|
|
将自己做的LeetCode相关题目整理了一下,以方便以后复习查看。
爬楼梯问题:
|
|
无限数量的硬币,凑成给定的值,选取所需硬币个数最少的。
递归方法为组合问题,将所有可能的找出来,选出其中最少的。复杂度O(2^n * n)
DP方法,维护一个数组,长度为amount+1, 初始值设置为amount+1,状态转移方程为dp[i] = min(dp[i], dp[i- coins[j] + 1])
|
|
题目是股票问题的变种,数组prices表示股票第i天的价格,可以多次买卖,限制只有手里没有股票时可以买,同时当你卖了股票,第二天不可以购买。股票问题其实比较简单,如果不限制第二天不可以买的话,就是一个简单的数组最大连续子数组和问题,添加之后需要,有三种状态,买,卖,休息。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
输入一个字符串,求字符串包含元素(含重复,比如aab的情况)的所有排列可能。
例如:输入abc,所有排列组合包括: abc, acb, bac, bca, cab, cba。
思路:如果输入为abcdef,则首先确定排列的第一个字母,有6中可能,如果选定a,则其后接bcdef的全排列,明显适用于递归结题。结题思路为第一个字母分别选定所有可能的情况,然后对剩下的字母进行递归。递归终止条件为选定的字母的下标为字符串长度-1。
实现
|
|
实现:
|
|
|
|
|
|
算法中关于二叉树的有很多,将最近做的关于二叉树相关的算法整理下,以备查看。
给定一个二叉树和一个sum值,返回true如果存在一个从根节点到叶子节点的路径,否则返回false。
|
|
给定一个二叉树和一个sum值,找到所有的从根节点到叶子节点的路径和为sum的路径并返回。
|
|
给定一个二叉树,节点值可以为负数,找到路径和等于sum的路径的个数,其中路径不需要从根节点开始,也不需要从叶子节点终止。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
如:
{0,1,1,1}
{1,1,1,0}
{1,0,1,1}
返回:
[0, 1, 2, 1]
[1, 1, 1, 0]
[1, 0, 1, 1]
|
|