算法
Doge Chen
这个作者很懒,什么都没留下…
展开
-
最近公共祖先
核心在于左右子树都存在所需点的话,那么祖先就是root。否则返回一边。题目一次后序遍历,计算深度的同时,将解答也返回,如果两子树深度相同,说明每颗子树都存在最深节点,此时返回root,否则返回子树深度大的,一路传上来的/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNo原创 2022-01-12 19:18:57 · 146 阅读 · 0 评论 -
树形dp题
题目/** * 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) .原创 2022-01-11 18:39:29 · 253 阅读 · 1 评论 -
后序遍历 优美
题目/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } .原创 2022-01-11 17:28:44 · 86 阅读 · 0 评论 -
最短路径 dijkstra算法 floyd算法
dijkstra算法的基本思想是贪⼼,每次都遍历所有邻居,并从中找到距离最⼩的,本质上是⼀种⼴度优先遍历。这⾥我们借助堆这种数据结构。题目class Solution { public int networkDelayTime(int[][] times, int n, int k) { List<int[]>[] graph = buildGraph(times, n); int[] minDistance = dijkstra(graph,原创 2022-01-10 15:40:08 · 262 阅读 · 0 评论 -
并查集 最小生成树 连通
贪心 + 并查集class Solution { public int minimumCost(int n, int[][] connections) { Arrays.sort(connections, (o1,o2) -> { return Integer.compare(o1[2],o2[2]); }); int res = 0; UF uf = new UF(n + 1); for原创 2022-01-07 15:54:55 · 298 阅读 · 0 评论 -
欧拉路径 Hierholzer 算法
思路普通节点出度和入度数是相等的,在while用完之前,我有入有出,又回去了,但是最后一个节点就不一样了,其出度数必定比入度数小1,最后一次走到这,应该是入度1次,出度0次,进来了发现回不去了呀,输出了我们的第一个需要的节点,也就是终点,同理,开始节点出度比入度大1,最后别人都走完了,他还要出最后一次,出完这一次,才能输出,也就是保证最后一个添加的是起点,这时候反转就ok啦。考虑到字典序,就需要排序啦,影响的也就是拆边的顺序,不可能影响到头尾:如果死胡同节点字典序更小,则当前直接进入死胡同。那么死胡原创 2022-01-06 15:33:28 · 446 阅读 · 0 评论 -
KMP算法
next:最长相等前后缀~~ 次长class Solution { public int strStr(String haystack, String needle) { int n = haystack.length(); int m = needle.length(); if(m == 0){ return 0; } int[] next = new int[m]; for(原创 2022-01-03 14:53:05 · 222 阅读 · 0 评论 -
二叉树遍历 迭代法 Morris法
前序遍历比较简单,注意入栈是右子节点先,后左节点,毕竟左结点马上要出栈,结束条件就是栈空class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<>(); if(root == null){ return res; }原创 2021-12-26 15:13:16 · 372 阅读 · 1 评论 -
剑指offer 把数字翻译成字符串有多少种结果
import java.util.*;public class Solution { /** * 解码 * @param nums string字符串 数字串 * @return int整型 */ public int solve (String nums) { // write code here int[] dp = new int[nums.length() + 1]; dp[0] = 1;.原创 2021-11-24 21:38:48 · 273 阅读 · 0 评论 -
递归回溯 值传递
在写算法题的时候,犯了一些错误,突入忘记了java是值传递,方法内的int和String之类的因此都是固定的(String是由于别的方法就算改变这个String,也是另外生成一个新的String,int则是值传递),而像ArrayList这些(比如递归回溯时候的path),值传递是一个地址,别的方法改变了,那就要回溯,否则方法栈回溯的时候,方法对应的变量就发生了变化。总结:String、Integer之类的需要发生变化就定义一个全局变量,不走方法内值传递。而ArrayList这些可以走值传递,但是又不原创 2021-11-23 20:12:17 · 616 阅读 · 0 评论 -
位运算技巧
位运算基本位运算与运算的用途:1)清零如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。2)取一个数的指定位比如取数 X=1010 1110 的低4位,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行按位与运算(X&Y=0000 1110)即可得到X的指定位。3)判断奇偶只要根据最未位是0还是1来决定,为0就是偶数,为1就是奇数。因此可以用if ((a & 1) == 0)代替if (a % 2原创 2021-11-08 13:54:12 · 212 阅读 · 0 评论 -
虚拟头结点
没有虚拟头结点,那头结点的删除需要分开考虑,不能通过slow.next = slow.next.nextListNode removeNthFromEnd(ListNode head, int n) { ListNode fast, slow; fast = slow = head; // 快指针先前进 n 步 while (n-- > 0) { fast = fast.next; } if (fast == null) { .原创 2021-11-01 19:04:52 · 1260 阅读 · 1 评论 -
算法——二分法
查找最左或者最右边界,思想应该是找到不可用的段12222335找最左边的2,很明显最后会跑到1,最后一次left = middle + 1,我们成功来到了最左边的2.以查找左边界为例,来到这段的边界也就是left=right时(不可用段的边界),此时如果nums[mid] < target,也就是向左走过了,需要向右回去一个,再执行一次left = mid + 1,打破循环条件,返回left,这个点可能是目标值,也可能比目标值大;否则就是这个点的值大于或者等于target(意味着),再执行一次ri原创 2021-11-01 17:37:28 · 99 阅读 · 0 评论 -
BFS Dijkstra
BFS// 输入起点,进行 BFS 搜索int BFS(Node start) { Queue<Node> q; // 核心数据结构 Set<Node> visited; // 避免走回头路 q.offer(start); // 将起点加入队列 visited.add(start); int step = 0; // 记录搜索的步数 while (q not empty) { int sz = q.siz原创 2021-10-25 15:38:22 · 403 阅读 · 0 评论 -
算法——递归
二叉树是用来训练递归的好题目。你要相信你函数的定义(因为这是你自己写的根据当前节点所做的所有操作,那递归调用当然可以信赖)。写好这个函数签名也是很有意义的工作,一般题目给的够用了,但是有时候返回的数据其实是不够看的,或者方法参数给的也不够用,这时候就需要我们自定义,比如1373.二叉搜索子树的最大键值和(困难),这题我们采用后续遍历的方法,需要的参数很多,所以返回值用的是一个数组,当然你用的爽了,自己这个节点也要写出来对应的确定返回值方法,不能光用不给,没这个道理,递归也不能用。写出base case原创 2021-10-23 12:48:31 · 158 阅读 · 0 评论