算法学习
uestcwhc
清华大学 数据科学和信息技术专业 博士在读
展开
-
二叉树的迭代遍历(先序、中序、后序)
二叉树的迭代遍历import java.util.*;public class Main { public static void inorder(TreeNode root){ Deque<TreeNode> stack = new ArrayDeque<>(); TreeNode cur = root; while(cur != null || !stack.isEmpty()){ if(c原创 2022-02-26 14:17:52 · 135 阅读 · 0 评论 -
深度优先搜索&宽度优先搜索
深搜与广搜比较:数据结构空间性质DFSstackO(h)不具最短路性质BFSqueueO(2h)具有最短路性质DFS边搜边回头,执着。回溯、剪枝。每个DFS都对应一条搜索树。想清楚搜索的顺序。想清楚遍历的顺序。回溯重要步骤:恢复现场。BFS眼光六路,耳听八方。每次只会扩展一层,不会离起始点太远。...原创 2022-02-18 11:22:38 · 312 阅读 · 0 评论 -
单调栈问题详细笔记
当元素出栈时,说明这个新元素是出栈元素向后找第一个比其小的元素举个例子,配合下图,现在索引在 6 ,栈里是 1 5 6 。接下来新元素是 2 ,那么 6 需要出栈。 当 6 出栈时,右边 2 代表是 6 右边第一个比 6 小的元素。当元素出栈后,说明新栈顶元素是出栈元素向前找第一个比其小的元素当 6 出栈时,5 成为新的栈顶,那么 5 就是 6 左边第一个比 6 小的元素。如接雨水这题class Solution { public int trap(int[] height)原创 2022-02-10 13:27:02 · 241 阅读 · 0 评论 -
Trie树、并查集、堆
Trie树用来高效地存储和查找字符串集合的数据结构使用Trie树通常存储要么全是小写、要么全是大写、要么全是数字并查集两大主要功能:将两个集合合并询问两个元素是否在一个集合当中并且近乎O(1)的时间复杂度内完成。基本原理:每个集合用一棵树来表示,树根的编号就是整个集合的编号,每个节点存储它的父节点,p[x]表示x的父节点。问题1: 如何判断树根? --〉if(p[x] == x)问题2: 如何求集合编号? --〉while(p[x] != x) x = p[x]最后这个x就是集合编原创 2022-02-05 20:34:26 · 530 阅读 · 0 评论 -
Java使用数组模拟「链表、栈与队列」(笔试常用)
写在前面:由于new操作比如new Node()是相当耗时的,并且笔试的时候数据量是比较大的,如果链表需要把节点都new出来可能会超时,这时候就需要使用数组来模拟。数组模拟链表(1)单链表常常使用邻接表来模拟,邻接表常常用来存储树和图。(2)双链表通常是用来优化某些题。e[N]: 某点的值是多少ne[N]: 某个点的next指针是多少e和ne使用下标来关联,0号点的值为e[0], next指针是ne[0], 显然ne[0] = 1,注意空节点的下标用-1来表示。数组模拟双向链表e[N],原创 2022-02-04 10:40:29 · 615 阅读 · 0 评论 -
离散化模版
把一组数映射到从0开始的自然数:0 1 2 3 … N具体实现:C++模版基本思路就是对这个值域很大很稀疏的数排完序之后,下标就是他们映射的值。数组去重算法:原创 2022-02-01 22:18:39 · 399 阅读 · 0 评论 -
双指针算法
双指针算法模版for(int i = 0, j = 0; i < n; i++){ while(j < i && check(i, j)) j++; //具体问题的逻辑}常见问题的分类:(1)对于一个序列,用两个指针维护一段区间(2)对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作...原创 2022-02-01 20:36:43 · 897 阅读 · 0 评论 -
位运算常用操作
lowbit()得到某个数的二进制最后一位1.比如说某二进制为1010,lowbit输出为10,比如说某数为101000,那lowbit输出为1000.具体实现是,x & (-x)即x & (~x + 1)作用:可以得到x中1的数量,具体实现是把最右边的1去掉。判断某数二进制表示的第k位是0还是1使用右移再与1x >> k & 1...原创 2022-02-01 20:26:22 · 357 阅读 · 0 评论 -
滑动窗口问题
滑动窗口的最大最小值问题:import java.util.*;class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); int n = in.nextInt(); int k = in.nextInt(); int N = 1000010; int[] a = new int[N];原创 2022-01-28 01:48:57 · 862 阅读 · 0 评论 -
快排和归并排序
快排模版class Solution { public int[] sortArray(int[] nums) { quickSort(nums, 0, nums.length -1); return nums; } public void quickSort(int[] nums, int l, int r){ if(l >= r) return; int key = nums[l]; int原创 2022-01-28 10:50:08 · 741 阅读 · 0 评论 -
二分算法只需背两种模版
整数二分有单调性,必然可以二分。如果没有单调性,也可能可以二分,二分的本质并不是单调性。模版//区间[l, r]被划分成[l, mid]和[mid + 1, r]使用int bsearch_1(int l, int r){ while(l < r){ int mid = l + r >> 1; if(check(mid)) r = mid; // check()判断mid是否满足性质。 else l = mid + 1; } return l;}//区间[l原创 2022-01-28 12:18:41 · 623 阅读 · 0 评论