
算法题
Jchgen
本科在读,主修java语言
展开
-
morris算法遍历二叉树
morris遍历时二叉树遍历的一种更高效的方式。其他基础的二叉树遍历不在这里赘述。二叉树的前中后序,层序遍历详解morris遍历可以达到空间复杂度O(1),时间复杂度O(2n)morris遍历过程:如果cur.left == null,直接cur = cur.right如果cur.left != null,就找到左子树中最右的结点,记做mostRight。如果mostRight.right == cur ,则将mostRight.right = null,然后cur = cur.right将原创 2021-10-27 21:59:30 · 268 阅读 · 0 评论 -
归并排序写不出来?可能是你思路太乱
归并排序的思想还是很简单的,但我之前也有的烦恼:一看就会,一写就废。看着不就是简单的分和并嘛,为啥一写就一脸懵逼。所以我决定来捋一捋归并排序,捋完发现写代码比思想还简单嘛。1.首先要记住归并排序的一些重点: 核心思想是分而治之,需要用到O(N)的额外空间 。根据这两点可以确定归并方法的参数//nums是原数组,left和right是左右边界下标,因为要分而治之//temp是额外的辅助数组mergeSort(int[] nums, int left, int right, int[] temp)原创 2021-08-12 11:07:50 · 300 阅读 · 0 评论 -
double的32位1如何强转为int?
今天刷题的时候看到了 绘制直线 这道题,有需求是将4294967295这个数,也就是二进制的32个1,转化为int型11111111 11111111 11111111 11111111 -> -1但如果直接转换, 像这样(int)(Math.pow(2, 32) - 1) 结果是int类型的最大值,而不是-1经过厕所,我发现这样可以达到想要的效果(int)(long)(Math.pow(2, 32) - 1) 利用long类型来作为中间人来转换,结果就变成了-1。后原创 2021-08-07 11:33:24 · 291 阅读 · 0 评论 -
LeetCode450. 删除二叉搜索树中的节点
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤:首先找到需要删除的节点;如果找到了,删除它。说明: 要求算法时间复杂度为 O(h),h 为树的高度。这道题完全可以利用二叉树的递归原理来解决,只需要找到要删除的结点,然后判断如果是叶子结点,可以直接删除如果有左子树没有右子树,左子树就代替删除的结点位置如果有右子树,就用右子树上最小的结点原创 2021-05-16 15:24:20 · 146 阅读 · 0 评论 -
二叉树的前中后序,层序遍历详解
文章目录前言一、前中后序遍历1.递归版本2.非递归版本二、层序遍历1.引入库2.读入数据总结前言本文对二叉树的前中后序,层序遍历的思路进行了解析,并给出了编写代码的思路和逻辑。包括前中后序的递归和非递归方法,实际上都是对栈的使用,层序遍历则是对队列的理解。一、前中后序遍历1.递归版本前序遍历: 跟结点 -> 左子树 -> 右子树中序遍历: 左子树 -> 跟结点 -> 右子树后序遍历: 左子树 -> 右子树 -> 跟结点因为递归版本比较简单,这里以原创 2021-04-27 20:14:54 · 525 阅读 · 0 评论 -
LeetCode面试题:八皇后(N皇后问题),经典面试题
设计一种算法,打印 N 皇后在 N × N 棋盘上的各种摆法,其中每个皇后都不同行、不同列,也不在对角线上。这里的“对角线”指的是所有的对角线,不只是平分整个棋盘的那两条对角线。注意:本题相对原题做了扩展实例:输入:4输出:[[".Q…","…Q",“Q…”,"…Q."],["…Q.",“Q…”,"…Q",".Q…"]]解释: 4 皇后问题存在如下两个不同的解法。[[".Q…", // 解法 1“…Q”,“Q…”,“…Q.”],["…Q.", // 解法 2“Q…”,“…Q”,原创 2021-04-19 20:51:47 · 329 阅读 · 0 评论 -
蓝桥杯2020年第十一届javaB组省赛
蓝桥杯2020年第十一届javaB组省赛A:门牌制作思路:判断1-2020每个数有多少个2即可,代码很容易实现答案:624public class A门牌制作 { public static void main(String[] args) { int res = 0; for (int i = 1; i <= 2020; i++) { int j = i; while (j > 0) {原创 2021-04-10 14:44:41 · 745 阅读 · 0 评论 -
汉诺塔和汉诺塔进阶问题【算法题】
题目:给定一个整数n,代表汉诺塔游戏中从小到大放置的n个圆盘,假设开始时所有的圆盘都在左边的柱子上,按照汉诺塔游戏的要求把所有的圆盘都移动到右边的主子上,实现函数打印最优移动轨迹。例:n=1 打印: move from left to rightn=2 打印: move from left to midmove from left to rightmove from mid to right进阶题目:给定一个整形数组arr,其中只含有1,2,3代表所有圆盘目前的状态,1代表左柱,2原创 2021-04-08 14:35:00 · 415 阅读 · 3 评论 -
最长递增子序列【算法题】
题目:给定数组arr,返回arr的最长递增子序列例:[2,1,5,3,6,4,8,9,7] => [1,3,4,8,9]要求 时间复杂度 O(NlogN)思路在代码中,getDpNB是时间复杂度为O(NlogN)的算法实现。public class 最长递增子序列 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextI原创 2021-04-07 22:41:02 · 300 阅读 · 0 评论 -
换钱的方法数【算法题】
【题目】给定数组arr,所有元素都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求换钱有多少种方法。【举例】arr=[5,10,25,1] aim=0返回1。组成0元的方法有一种,即所有货币都不用arr=[3,5] aim=2返回0。无法组成2.arr=[5,10,25,1] aim=15返回6。35,5+10,101+5,151,25+51,10+51代码:changeMoneyNB()是时间复杂度 O(n*aim) 空间复原创 2021-04-05 16:03:29 · 516 阅读 · 3 评论 -
求最大子矩阵的大小
*** 求最大子矩阵 例如1 1 0 11 1 1 11 1 1 1最大为1 1 1 11 1 1 1**public class MaxSubMatrix { public static void main(String[] args) { System.out.println(getMaxSubMatrix(new int[][]{{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1},})); } /**原创 2020-12-24 13:17:33 · 232 阅读 · 0 评论 -
LeetCode93题 复原IP地址
思路:用递归回溯的方法 先穷举第一段 然后递归穷举后三段,最后一段特殊处理 public List<String> restoreIpAddresses(String s) { List<String> res = new ArrayList<>(); StringBuilder sb = new StringBuilder(); helper(s, 0, sb, res);// k 初始化 0 表示当前为第1段原创 2020-11-03 17:22:36 · 151 阅读 · 0 评论