LeetCode(力扣):对称二叉树

LeetCode(力扣):对称二叉树

方法一(递归法):

/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { public boolean isSymmetric(TreeNode root) { //数为空,则对称 if(root == null){ return true; } //交给递归函数 return check(root.left,root.right); } private boolean check(TreeNode leftNode,TreeNode rightNode){ if(leftNode == null && rightNode == null){ return true; } //一边空另一边不空,不对称 if(leftNode == null || rightNode == null){ return false; } //数值不等,不对称 if(leftNode.val != rightNode.val){ return false; } //下一层的比较 boolean outside = check(leftNode.left,rightNode.right); boolean inside = check(leftNode.right,rightNode.left); return outside && inside ; } }

方法二(迭代法):

/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { public boolean isSymmetric(TreeNode root) { //根节点的判断 if(root == null){ return true; } //初始化队列 Queue<TreeNode> queue = new LinkedList<>(); //将左右节点入队 queue.offer(root.left); queue.offer(root.right); //只要队列不空就循环 while(!queue.isEmpty()){ //同时出列两个节点 TreeNode leftNode = queue.poll(); TreeNode rightNode = queue.poll(); //对刚出来的两个节点进行三层的比较 if(leftNode == null && rightNode == null){ continue; } if(leftNode == null || rightNode == null){ return false; } if(leftNode.val != rightNode.val){ return false; } //对刚才两个节点的下一层节点入队 queue.offer(leftNode.left); queue.offer(rightNode.right); queue.offer(leftNode.right); queue.offer(rightNode.left); } return true; } }

offer():将元素入队

poll():将元素出队

ArrayList与LinkedList:

ArrayList是数组,LinkedList是链表,这里不能用ArrayList,因为队列对开头元素做处理,开头元素如果出队后续的数组元素要往前移一位时间复杂度为O(n);而LinkedList只需要将第一个元素和第二个元素断链即可O(1)的时间复杂度。另外ArrayList根本也没有实现Queue接口。


关注我带你每天刷题!!!

Read more

Java字符串算法核心攻略

Java字符串算法核心攻略

Java字符串算法核心攻略 提示:在 ASCII 码(美国信息交换标准代码)中,大小写英文字母和数字的十进制数值范围如下: * 大写字母 (A - Z):65 到 90 * ‘A’ 是 65 * ‘Z’ 是 90 * 小写字母 (a - z):97 到 122 * ‘a’ 是 97 * ‘z’ 是 122 * 数字是 (0-9):48 到 57 * ‘0’ 是 48 * ‘9’ 是 57 一、必会的字符串方法 刷题前先把这些方法练熟,后面会反复用到。 1.

By Ne0inhk
【动态规划】买卖股票相关问题

【动态规划】买卖股票相关问题

一、买卖股票的最佳时机含手续费 714. 买卖股票的最佳时机含手续费 题目描述: 题目分析: 1、状态分析 其实一共就只有两种状态,不是处于 持有 状态,就是处于 未持有 状态。 * f[i]表示第i天结束后,处于 持有 状态时,最大的利润 * g[i]表示第i天结束后,处于 未持有 状态时,最大的利润 2、状态转移方程 对于f[i],有两种情况可以到达这种状态: * 在第 i-1 天时就已处于 持有 状态,然后第 i 天啥也不干,仍然保持 持有 状态。此时的最大利润就为 f[i - 1]

By Ne0inhk
从冒泡到模拟q sort函数——初见排序算法的探索和思考

从冒泡到模拟q sort函数——初见排序算法的探索和思考

国庆中秋喜相连,万家团圆乐同庆。 各位小伙伴们大家好,我是此方,在此,先祝大家双节快乐! 我们都知道排序有很多种:例如冒泡排序,插入排序,快速排序,等等很多种。 而冒泡排序,是各种计算机语言中最经典的一种排序算法。 今天我将从冒泡排序开始,到实现qsort函数的模拟。逐层深入,探索排序问题。 并给出鄙人的一些拙见。 上正文: 一,冒泡排序:最经典的排序算法 假如有一个十元素整型数组,他是完全倒着排序的:就像这样 now,我们要按照从小到大的顺序将这十个数字重新排列。 如果我们想要用冒泡排序:那么他的逻辑应该是这样的: 首先让最左边的数字和他右边的数字比较:9>8,将9和8互换位置: 让9继续和他右边的数字比较,再互换位 以此类推:9不断的比较——>移动——>再比较:最后;会到达最右边,这样,我们就让最大的数字9放在了最低位置 然后是8,接下来是7,6,5.

By Ne0inhk
算法思想之深度优先搜索(DFS)、递归以及案例(最多能得到多少克黄金、精准核酸检测、最富裕的小家庭)

算法思想之深度优先搜索(DFS)、递归以及案例(最多能得到多少克黄金、精准核酸检测、最富裕的小家庭)

深度优先搜索(DFS)、递归 * 深度优先搜索(Depth First Search,DFS)是一种用于遍历或搜索树或图的算法。在 DFS 算法中,从起始节点开始,沿着一条路径尽可能深地访问节点,直到到达叶子节点或者无法继续前进为止。然后退回到最近的一个有未探索节点的分支节点,继续探索其他路径,直到所有节点都被访问过为止。 * 深度优先搜索常常用于解决以下类型的问题:深度优先搜索是一种简单而强大的算法,可以解决许多实际问题。 * 图遍历:在无向图或有向图中寻找特定节点之间的路径、判断图的连通性等。 * 连通性问题:判断图中是否存在环、判断图的强连通分量等。 * 组合问题:生成排列、组合或子集等组合型问题。 * 寻路问题:求解从起始点到目标点的最短路径或所有可行路径。 * 递归问题:通过递归实现深度优先搜索,例如二叉树的遍历等。 小华最多能得到多少克黄金 * 题目描述小华按照地图去寻宝,地图上被划分成 m 行和 n 列的方格,横纵坐标范围分别是 [0, n-1] 和 [0, m-1]。在横坐标和纵坐标的数位之和不大于 k

By Ne0inhk