note-verse
记录下看到的好词好句吧
诗句
写景 & 咏物
看山看水独坐,听风听雨高眠。 客来客去日日,花开花落年年。——徐贲【写意】
秋阴不散霜飞晚,留得残荷听雨声。——李商隐【宿骆氏亭寄怀崔雍崔衮】
花开花落花无悔,缘来缘去缘如水。——李清照【残花】
写意 & 抒情
年年岁岁花相似,岁岁年年人不同。——刘希夷【代悲白头翁】
花有重开日,人无再少年。——陈著【续侄溥赏酴醾劝酒二首其一】
人生若只如初见,何事秋风悲画扇。—— 纳兰容若【木兰花令•拟古决绝词】
我本将心向明月,奈何明月照沟渠。——高明【琵琶记】
林花谢了春红,太匆匆。无奈朝来寒雨晚来风。胭脂泪,相留醉,几时重?自是人生长恨水长东。——李煜【相见欢】
得即高歌失即休,多愁多恨亦悠悠。 今朝有酒今朝醉,明日愁来明日愁。——罗隐【自遣】
欲买桂花同载酒,终不似,少年游。——唐多令【芦叶满汀州】
明月多情应笑我,笑我如今。辜负春心,独自闲行独自吟。近来怕说当时事,结遍兰襟。月浅灯深,梦里云归何处寻。——纳兰性德【采桑子】
锦瑟 ...
algorithm-sort
一些常见的排序
algorithm-binary-search
二分查找
二分查找(Binary Search)是一种高效的搜索算法,适用于有序数组或有序列表。它通过不断地将搜索范围减半来查找目标元素,从而在O(log n)的时间复杂度内找到特定元素的位置。
在有序数组中找到中间位置的元素,与目标元素进行比较。如果中间元素等于目标元素,则搜索成功;如果中间元素大于目标元素,则在数组的左半部分继续进行二分查找;如果中间元素小于目标元素,则在数组的右半部分进行二分查找。通过不断重复这个过程,直到找到目标元素或搜索范围缩小到为空为止。
基本模板
找到大于等于target的第一个数(最左边)(最小化最大值)
nums = [1, 2, 4, 5, 5, 6], target = 5 -> res = 3
位置越往左可能性越低(越不符合条件),所以需要符合if条件时r = m来逼近答案
123456int l = 0, r = n;while (l < r) { int m = l + (r-l)/2; if (nums[m] >= target) r = m; else l = m + 1;}
找 ...
algorithm-union-find
并查集(union-find)
介绍
概念
当涉及到处理元素之间的等价关系、集合的合并与查询等问题时,它是一种用于维护不相交集合的有效方法,常被用于解决诸如连通性、网络连接状态、等价关系等问题。
核心思想
并查集通过构建一个森林(或者称为集合),其中每个元素都属于一个集合,每个集合以一个代表元素来标识。这样的数据结构可以高效地进行两个关键操作:查找和合并。
操作
查找(Find): 查找一个元素所属的集合,通常以代表元素作为标识。这个操作通常用于判断两个元素是否属于同一个集合,即判断它们的代表元素是否相同。
123int find(int x) { return pa[x] == x ? x : (pa[x] = find(pa[x]));}
合并(Union): 将两个不相交的集合合并为一个集合,即将两个集合的代表元素连接在一起。
123void union(int x, int y) { // 简洁写法,不考虑秩 pa[find(x)] = pa[y];}
12345678910111213void union(int ...
algorithm-misc
质数
计算不同质因子的数目
比方说,300的不同质因子的数目为3,因为 300 = 2 * 2 * 3 * 5 * 5 。
1234567891011// 计算10^5内的数的不同质因子的数目private static final int MX = (int) 1e5 + 1;private static final int[] omega = new int[MX];static { for (int i = 2; i < MX; i++) if (omega[i] == 0) // i 是质数 for (int j = i; j < MX; j += i) omega[j]++; // i 是 j 的一个质因子}// 作者:灵茶山艾府// 链接:https://leetcode.cn/problems/apply-operations-to-maximize-score/solutions/2385936/gong-xian-fa-dan-diao-zhan-pythonjav ...
algorithm-linked-list
链表相关
翻转链表
12345678910ListNode reverseList(ListNode head) { ListNode pre = null, cur = head; while (cur != null) { ListNode next = cur.next; cur.next = pre; pre = cur; cur = next; } return pre;}
快慢指针找中间节点
12345678ListNode getMidNode(ListNode head) { ListNode fast = head, slow = head; while (fast != null && fast.next != null) { slow = slow.next; fast = fast.next.next; } return slow;} ...
note-java
关于Java的一些笔记
tips-java
Java刷题技巧
数组相关操作
常见
1234567int arr[] = new int[size], n = arr.length; // 简化定义方式Arrays.equals(T[], T[]); // 比较System.arraycopy(src, 0, dst, 0, len); // 复制Arrays.copyOf(src, len); // 复制Arrays.copyOfRange(src, from, to); // 复制cnt[nxt] = cnt[cur].clone(); // 复制(克隆)
sort
12345Arrays.sort(T[], Comparator); int arr[][] = {{1, 3}, {3, 1}};Arrays.sort(arr, (a,b)->b[1]-a[1]);int arr2[] = {1,3,2};Arrays.sort(arr2, (a,b)->b-a); // 报错,当放入Comparator参数时, ...
algorithm-dijkstra
Dijkstra算法
概念
Dijkstra 算法是一个可以解决单一源点最短路径问题的经典算法,本质上是对广度优先搜索(BFS)的一个推广,只是把 BFS 维护的栈换成了优先队列。
Dijkstra算法成立的前提条件是不存在负权的边,这意味任何一条路径,从起点开始到路径中每个点的距离都是依次递增的。所以按照递增的顺序来依次计算出最短路径也就是Dijkstra算法了
每次循环都会增多一个保证已经找到最短路的点。
直观来说,如果我们已经求出了k个离源点距离最近的点,以及它们各自的距离,那么到源点距离第k+1近的点,它到源点的最短路径只能经过这前k个点——如果经过了其他点,那么这个其他点显然离源点更近,那这个点一定不是第k+1近了。既然只经过这前k个点,那么只用这前k个点放缩就可以找到那个最短路径了。再加上前k-1个点上一轮已经放缩过,所以每一轮只需要用新加入的节点进行放缩就行了。
1234567891011121314151617181920212223int g[][] = new int[n][n];for (int i = 0; i < n; i++) Arrays.fill( ...
algorithm-topo-sort
拓扑排序
概念
拓扑排序是一种在有向图中对节点进行排序的算法,其中每个节点表示一个任务或事件,而有向边表示任务间的依赖关系。拓扑排序可以帮助我们找到一种满足依赖关系的节点排列顺序,从而确保所有依赖关系得到满足。
概述
拓扑排序通常用于解决有向无环图(DAG)中的任务调度、依赖分析、编译顺序等问题。在一个有向图中,每个节点代表一个任务,而有向边代表任务间的依赖关系。拓扑排序的目标是找到一种节点排列,使得每个节点都排在它的后继节点之前,从而满足所有的依赖关系。
基于BFS的拓扑排序算法步骤
初始化一个队列,将所有入度为 0 的节点入队。
当队列不为空时,执行以下操作:
从队列中弹出一个节点,将其添加到结果列表中。
遍历该节点的所有后继节点(邻居节点):
将后继节点的入度减一。
如果后继节点的入度变为 0,则将其入队。
重复步骤 2,直到队列为空。
基于DFS的拓扑排序算法步骤
选择一个没有入边的节点作为起点。
对起点节点进行DFS遍历,将遍历过程中的节点按照逆序加入到结果列表中。
重复步骤 1 和步骤 2,直到所有节点都被遍历过。
课程表
你这个学期必须选修 numC ...