手撕代码基础
一.链表类
1.链表基础操作:
1 | //NODE |
2.链表倒置:
1 | LinkNode prev = null; |
3.循环链表:
1 | p = head; |
4.两个链表的第一个公共节点:
遍历两个链表得到它们的长度a、b,在较长链表上先走a-b步,然后一起遍历直到有相同节点。时间复杂度O(m+n)。
5.链表快排:
1 | pNode* partition(pNode* start,pNode* end){ |
6.合并两个有序链表:
1 | public ListNode mergeTwoLists(ListNode l1, ListNode l2) { |
二.二叉树类
1.找最近公共子节点:
1 | public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { |
2.非递归的先序、中序、后虚遍历
先序:
1 | void preorder(binode* root){ |
中序:
1 | void midorder(binode* root){ |
后序:
1 | void postorder(binode* root){ |
3.二叉树层次遍历:
1 | void layerorder(binode* root){ |
4.二叉搜索树中第K小的元素:
1 | public int kthSmallest(TreeNode root, int k) { |
三.排序和查找类
1.快排:
1 | void quickSort(vector<int> &num, int l, int r) { |
2.归并:
1 | void mergearr(int* a, int begin, int mid, int end, int *temp){// 归并排序单元使用 |
3.堆:
1 | void HeapAdjust(int k[],int p,int n){//大顶堆的构造,传入的i是父节点 |
4.二分:
1 | int getkey (int* a, int key, int low, int high){ |
四.图类
1.DFS:(普遍递归就行了。。)
1 | public void DFSWithStack(TreeNode root) { |
2.BFS:
1 | public void BFSWithQueue(TreeNode root) { |
3.最短路径问题:
任意两点间的最短路,floyd算法,时间复杂度过高O(n^3);
1 | for(int k = 1; k <= n; k++) |
单源最短路,Dijkstra,基于贪心,无法处理负边;
1 | for(int i = 1; i <= n; i++) dis[i] = e[1][i]; //初始化dis为源点到各点的距离 |
处理负边可以用Bellman-Ford。
1 | for(int i = 1; i <= n; i++) dis[i] = INF; |
4.最小生成树
prim算法:
1 | int[] lowcost = new int[vertexSize]; // 定义一维数组,存放用于比较最小权值的顶点权值,0代表已经比较过 |
kruskal:
1 | public void createMinSpanTreeKruskal() { |
五.基础算法
1.全排列:
1 | private static void permutation(int[] array, int index) { |
2.数组子集:
1 | res = [] |
3.极大数相加相减相乘:
(不想写
4.奇偶排序,给一个数组,让奇数在前面偶数在后面,或者偶数在前面奇数在后面:
先计算出奇数的个数count,然后用双指针来遍历,一个从头遍历到count,一个从数组尾部遍历到count。从前向后找到一个偶数的下标,从后向前找到一个奇数的下标,然后交换对应的值。直到遍历完整个数组。时间复杂度为O(n),空间复杂度为O(1)。
1 | int front = 0,end = arr.length-1;//设置两个指针,一个指向头部,一个指向尾部 |
六.贪心和DP
1.LEETCODE322硬币问题:
1 | public int coinChange(int[] coins, int amount) { |
七.位运算类
八.数组类