
算法
光阴不负卿
进击的程序员
展开
-
二叉树中序遍历的三种方法
题目描述:给定一个二叉树的根节点root,返回它的中序遍历。方法一:递归思路与算法:二叉树的中序遍历:按照访问左子树-根节点-右子树的方式遍历这棵树,而在访问左子树或者右子树的时候我们按照同样的方式遍历,直到遍历这棵树,而在访问左子树或者右子树的时候我们按照同样的方式遍历,直到遍历完整棵树。因此整个遍历过程天然具有递归性质,我们可以直接用递归函数来模拟这一过程。定义inorder(root)表示当前遍历到root节点的答案,那么按照定义,我们只要递归调用inorder(root.left原创 2020-12-31 19:29:18 · 2394 阅读 · 3 评论 -
求解二叉树的镜像问题
题目描述:输入一个二叉树,输出它的镜像。递归法:根据二叉树镜像的定义,考虑递归遍历二叉树,交换每个结点的左右子节点,即可生成二叉树的镜像。递归解析:终止条件:当结点root为空时(即越过叶节点),则返回Null递推工作:初始化结点tmp,用于暂存root的左子节点开启递归右子节点mirrorTree(root.right),并将返回值作为root的左子节点开启递归左子节点mirrorTree(tmp),并将返回值作为root的右子节点返回值:返回当前结点rootpublic Tr原创 2020-12-20 17:37:21 · 241 阅读 · 1 评论 -
二叉树的最近公共祖先
题目描述:## 标题给定一个二叉树,找到该树中两个指定节点的最近公共祖先。公共祖先的定义:对于有根树T的两个节点p、q,最近公共祖先表示为一个节点x,满足x是p、q的祖先且x的深度尽可能大,一个节点也可以是它自己的祖先。算法思想:若root是p、q的最近公共祖先,则只可能为以下情况之一:p和q在root的子树中,且分列root的两侧(即分别在左、右子树中)p = root,且q在root的左或右子树中q = root,且p在root的左或右子树中通过递归队二叉树进行后序遍历,当遇到节点p原创 2020-12-20 17:03:56 · 396 阅读 · 0 评论 -
计算二叉树的深度
题目描述:输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点一次经过的节点(含根、叶节点)形成的一条路径,最长路径的长度为树的深度。树的遍历方式总体分为两类:深度优先搜索(DFS)、广度优先搜索(BFS);常见的DFS:先序遍历、中序遍历、后序遍历 常见的BFS:层序遍历(即按层遍历)后序遍历:树的深度就等于左子树的深度与右子树的深度中最大值加上1。算法java实现:public int maxDepth(TreeNode root) { if (root == n原创 2020-12-18 15:52:23 · 2171 阅读 · 1 评论 -
判断平衡二叉树
题目描述:输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一颗平衡二叉树。算法思想:二叉树的每个结点的左右子树的高度差的绝对值不超过1,则二叉树是平衡二叉树。根据定义,一颗二叉树是平衡二叉树,当且仅当其所有子树也都是平衡二叉树,因此可以使用递归的方式判断二叉树是不是平衡二叉树,递归的顺序可以是自顶向下或者自底向上。算法java实现:public boolean isBalanced(TreedNode root) {原创 2020-12-18 15:25:21 · 167 阅读 · 0 评论 -
对称二叉树两种判定方法
题目描述:给定一个二叉树,检查它是否镜像对称的。//二叉树镜像对称 1 / \ 2 2 / \ / \3 4 4 3//不是镜像对称 1 / \ 2 2 \ \ 3 3方法一:递归算法思路:如果一个树的左子树与右子树镜像对称,那么这个树是对称的。因此该问题可以转化为:两个树在什么情况下互为镜像。如果同时满足下面两个条件,两个树互为镜像:它们的两个根节点具有相同的值 每个树的右子树都与另一个树的左子树镜原创 2020-12-17 11:37:14 · 604 阅读 · 0 评论 -
循环遍历解决单词规律问题
题目描述:给定一种规律pattern和一个字符串str,判断str是否遵循相同的规律。这里的遵循是指完全匹配,例如,pattern里的每个字母和字符串str中的每个非空单词之间存在着双向连接的对应规律。比如:pattern = "abba" , str = "dog cat cat dog",此时遵循相同的规律,输出为true。算法思想:如果字符串str中非空字符的长度不等于字符串pattern的长度,则两者就不可能遵循相同的规律;否则,遍历字符串,判断对应规律是否相同,若存在不相同,则两者原创 2020-12-16 21:36:28 · 379 阅读 · 0 评论 -
使用双指针合并两个有序数组
题目描述:给定两个有序数组nums1和nums2,请你将nums2合并到nums1中,使nums1成为一个有序数组。说明:初始化nums1和nums2的元素数量分别为m和n 假设nums1有足够的空间(空间大小大于或等于m+n)来保存nums2中的元素算法思路:一般而言,对于有序数组可以通过双指针法达到O(n+m)的时间复杂度最直接的算法实现是将指针p1置为nums1的开头,p2为nums2的开头,在每一步将最小值放入输出数组中。由于nums1是用于输出的数组,需要将nums1中的前原创 2020-12-16 20:26:14 · 1899 阅读 · 0 评论 -
判定两颗二叉树是否相同
题目描述:给定两个二叉树,编写一个函数来校验它们是否相同。如果两个树在结构上相同,并且结点具有相同的值,则认为它们是相同的。算法思路:利用深度优先搜索,如果两个二叉树都为空,则两个二叉树相同。如果两个二叉树中有且只有一个为空,则两个二叉树一定不相同。如果两个二叉树都不为空,那么首先判断它们的根节点的值是否相同,如果不相同则两个二叉树一定不同,若相同,在分别判断两个二叉树的左子树是否相同以及右子树是否相同。这是一个递归的过程,一次可以使用深度优先搜索,递归地判断两个二叉树是否相同。算法java原创 2020-12-14 21:22:47 · 7491 阅读 · 0 评论 -
删除排序链表中的重复元素
题目描述:给定一个排序链表,删除所有的重复元素,使得每个元素只出现一次。算法思路:此题考查操作列表的节点指针的能力,由于输入的列表已经排序,一次我们可以通过将节点的值与它之后的节点进行比较来确定它是否为重复结点。如果是重复的,我们更改当前结点next指针,以便它跳过下一个节点并直接指向下一个结点之后的结点。算法java实现:public ListNode deleteDuplicates(ListNode head) { ListNode current head; w原创 2020-12-14 20:47:37 · 213 阅读 · 0 评论 -
利用动态规划求解爬楼梯问题
题目描述:假设你正在爬楼梯,需要n阶才能到达楼顶。每次可以爬1或2阶,你有多少种不同的方法可以爬到楼顶呢?其中n是一个正整数。思路和算法:利用动态规划,用f(x)表示爬到第x级台阶的方案数,考虑到最后一步可能跨越了一级台阶,也可能跨越了两级台阶,所以我们可以列出如下式子:f(x) = f(x-1)+f(x-2)。它意味着爬到第x-1级台阶的方案数和爬到第x-2级台阶的方案数的和。这里要统计方案总数,我们就需要对这两项的贡献求和。以上就是动态规划的转移方程,下面来确定边界条件,我们是从第0级开原创 2020-12-14 20:27:06 · 629 阅读 · 0 评论 -
二分查找求解x的平方根
题目描述:实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。思路和算法:由于x平方根的整数部分ans是满足k平方<=x的最大值,因此我们可以对k进行二分查找,求解答案。二分查找的下界为0,上界可以粗略地设定为x。在二分查找的每一步中,我们只需要比较中间元素mid的平方与x的大小关系,并通过比较的结果调整上下界的范围。由于我们所有的运算都是整数运算,不会存在误差,因此在得到最终答案ans原创 2020-12-14 17:54:42 · 440 阅读 · 0 评论 -
二进制求和问题
题目描述:给定一个二进制字符串,返回它们的和(用二进制表示),已知字符串非空且只包含1和0。思路和算法:可以模拟十进制中的加法,只不过在十进制中式锋十进一,二进制中需要逢二进一。具体的,我们可以取n = max{|a|,|b|},循环n次,从最低为开始遍历。我们使用一个变量carry表示上一个位置的进位,初始值位0。记当前位置对齐的两个位位ai 和 bi,则每一位的答案为(carry + ai + bi)mod 2,下一位的进位为(carry+ai+bi_/2。重复上述步骤,直到数字a和b的原创 2020-12-14 16:30:21 · 298 阅读 · 1 评论 -
文件加密算法比较:SHA1、SHA256、MD5
MD5算法:MD5是一个安全散列算法,输入两个不同的明文不会得到相同的输出值,根据输出值,不能得到原始的明文,即其过程是不可逆的;所以要破解MD5没有现成的算法,只能穷举法,把可能出现的明文,用MD5算法散列之后,把得到的散列值和原始的数据形成一个一对一的映射表,通过匹配从映射表中找出破解密码所对应的原始明文。SHA1算法:SHA-1是一种数据加密算法,该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把原创 2020-11-20 20:02:00 · 5169 阅读 · 0 评论 -
Java StringBuffer 和 StringBuilder
当对字符串进行修改的时候,需要使用StringBuffer和StringBuilder类。和String类不同的是,StringBuffer和StringBuilder类的对象能够被多次修改,并且不产生新的未使用对象。StringBuilder不是线程安全的,不能同步访问,这是它和StringBuffer之间最大的不同。StringBuffer方法:public StringBuffer append(String s) 将指定的字符串追加到此字符序列 public StringBuff...原创 2020-10-05 12:28:50 · 115 阅读 · 2 评论