![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 66
不搞数学的汤老师
不是各位卷死在下,就是在下卷死各位!
展开
-
使用小学数学解决的算法题
质因数分解思路小学五年级数学:质因数分解(唯一分解定理)。由质数相乘所构成的合数,分解出来的质数是唯一的。找到能分解 nnn 的最小质数 ddd,则 nd\frac nddn 则为最大的质数复杂度时间复杂度:O(n)O(\sqrt n)O(n),因为 d≤ndd \leq \frac n dd≤dn,所以 $d \leq \sqrt n $, ddd 最多只需要枚举 n\sqrt nn 次空间复杂度:O(1)O(1)O(1)代码#include <iostream>u原创 2022-01-04 03:26:55 · 482 阅读 · 0 评论 -
Java 并查集代码
public class UnionFind<V> { private class Node<V> { V value; public Node(V v) { value = v; } } // 元素与节点对应关系 private HashMap<V, Node<V>> nodes; // 节点与父节点对应关系 private H转载 2022-01-06 03:38:56 · 209 阅读 · 0 评论 -
2022 年哈工大 854 算法大题
用三个栈 s1 s2 s3 实现队列push:在队尾插入一个元素pop:删除并返回队头元素max:返回整个队列中最大的元素,要求时间复杂度 O(1)O(1)O(1)可以直接使用操作栈的函数原创 2021-12-27 14:00:06 · 1064 阅读 · 0 评论 -
CSAPP 第二章课后作业,主要是位运算
2.58判断大小端存储int is_little_endian() { union { int a; char b; } u; u.a = 1; if (u.b) return 1; else return 0;}2.59生成一个数字,最低有效字节为 x 的最低有效字节,其余部分由 y 剩下字节组成(x & 0xff) | (y & ~0xff)2.60将 x 中第 i 个字节置换成 bint re原创 2021-09-29 20:13:16 · 394 阅读 · 0 评论 -
计算机的表达式求值——逆波兰数
波兰数与逆波兰数波兰数解决的是这样的一个问题:如果操作符与操作数是固定的,则语法上不需要括号仍然能被无歧义地解析。波兰数又称之为前缀表达式,逆波兰数又称之为后缀表达式。而日常使用的表达式则称为中缀表达式。中缀表达式小学老师告诉我们,一个表达式的构成包含操作符(加减乘除)、操作数和括号构成。如何无需括号的参与就能正确无误的解析这个表达式?这就是波兰数要解决的问题。举个例子,如:(15/7−(1+1))∗3−(2+(1+1))(15 / 7 - (1 + 1)) * 3 - (2 + (1 + 1原创 2021-09-13 04:03:29 · 875 阅读 · 0 评论 -
详解 KMP 算法
暴力匹配S1:aabaabsaabaabaabsaabt 与 S2:aabaabsaabt 暴力匹配流程如下。aabaabsaabaabaabsaabt^ 从头开始匹配aabaabsaabt^------------------------------------------------------------------------aabaabsaabaabaabsaabt ^aabaabsaabt ^ 发生不匹配-----------------原创 2021-08-06 21:16:25 · 589 阅读 · 0 评论 -
位运算的妙用:异或
认识异或异或即无进位加法 0101 1011 ^ 1010 0101 = 1111 1110满足交换律和结合律(阿贝尔群):a ^ b = b ^ a,(a ^ b) ^ c = a ^ (b ^ c)单位元 0,a ^ 0 = a;逆元 a,a ^ a = 0根据 3. 可推广为:偶数个 a 异或则会 0;奇数个 a 异或则还是为 aswap交换俩数vector<int> swapNumbers(vector<int>& a) { a[0] ^原创 2021-07-04 17:29:15 · 365 阅读 · 0 评论 -
刷透背包(01 背包,完全背包,多重背包,分组背包,混合背包,二维费用背包)
01 背包和完全背包是重点,分组背包是 01 背包的扩展,多重背包是受限制的完全被逼包01 背包解题思路代码原始做法#include <iostream>using namespace std;const int N = 1010;int v[N], w[N], f[N][N];int main() { int n, m; cin >> n >> m; for (int i = 1; i <= n; i++) c.原创 2021-05-02 10:32:26 · 797 阅读 · 1 评论 -
快排、归并与堆排模版
快排void quick_sort(int q[], int l, int r) { if (l >= r) return; int i = l - 1, j = r + 1, x = q[l + r >> 1]; while (i < j) { do i++; while (q[i] < x); do j--; while (q[j] > x); if (i < j) swap (q[i],原创 2021-01-30 13:08:19 · 146 阅读 · 0 评论 -
树的递归遍历与递归序
树的遍历void pre(Node head) { // 先序 if (head == null) return; printf("%c ", head.element); pre(head.left); pre(head.right);}void mid(Node head) { // 中序 if (head == null) return; mid(head.left); printf("%c ", head.element); mid(head.right);}void po原创 2021-01-21 14:06:02 · 1076 阅读 · 2 评论 -
认识哈希
1 哈希性质输入无穷,输出有穷无随机机制,一个输入有且只有唯一的输出不同的输入输出可能相同(哈希碰撞),保证尽量不同散列尽量均匀具有不可逆性2 分而治之举例:40 亿整数文件,整数 4 个字节,只有1GB内存,返回次数最多的数一个数最多出现 40 亿次,如果每个都出现一次,也就最多 40 条记录所以使用哈希表则最少需要 4 B 的 key 和 4 B 的 value,其他都不算的情况下,最少也得需要 (4 + 4)* 40 亿 = 320 亿 也就是 32G,所以这个方案不可行这时我原创 2020-10-25 23:43:54 · 210 阅读 · 0 评论 -
常见链表面试题解题思路
1 找中点快慢指针奇数中点,偶数上中点奇数中点,偶数下中点奇数中点前一个,偶数上中点前一个奇数中点前一个,偶数下中点前一个2 回文遍历压栈法右半部分压栈法右半部分改指针法3 左大中等右小放入数组,partition链表法4 特殊链表复制// 提供特殊的节点class Node { int value; Node next; // 指向下一个节点,是无环的 Node rand; // 随便指向一个节点 ,可能有环 Node原创 2020-06-08 22:42:29 · 225 阅读 · 0 评论 -
堆与堆排序
1 大根堆与小根堆1.1 介绍大根堆与小根堆必须是完全二叉树大根堆的父节点永远比子节点大或相等小根堆的父节点永远比子节点小或相等本文皆以大根堆为例1.2 PUSH思路尾部增加元素调整为大根堆:与父节点比对,若大于父节点则交换位置,直到小于等于父节点或没有父节点时停止代码void push(int value) { if (isFull()) throw new RuntimeException("heap is full"); heap[heapSize]原创 2020-11-06 02:45:49 · 279 阅读 · 0 评论 -
master 估算递归函数时间复杂度
1 master 表达式T(N) = a T(N/b) + O(Nd)T(N):整个算法的时间复杂度a:子过程个数T(N/b):子过程的时间复杂度O(Nd):出去子过程以外的时间复杂度若 log(b)a > d,则时间复杂度为 O(Nlog(a)b)若 log(b)a < d,则时间复杂度为 O(Nd)若 log(b)a = d,则时间复杂度为 O(Nd * logN)(注意:log(b)a是log以b为底a)2 举例log(2)2 = 1N1 -> d = 1原创 2020-05-18 03:26:06 · 201 阅读 · 0 评论 -
快排及partition和荷兰国旗问题
1 快排核心1.1 partition 问题问题描述:给定一个数组 arr 和一个数 num ,将小于等于 num 的数放在左边,大于 num 的数放在右边解题思路:双指针,一个指针 p 指向小于等于区最后一个元素,一个指针 i 指向该数组的元素若该元素小于等于 num,小于等于区扩展,并与小于等于区最后一个元素交换,然后 i 指针指向下一个元素若该元素大于 num,i 指针直接指向下一个元素直到遍历完整个数组为止代码实现void partition(int[] arr, int nu原创 2020-05-18 02:31:15 · 220 阅读 · 0 评论 -
归并排序及降序对和数组小和问题
1 介绍1.1 实现流程让左边排好序让右边排好序合并后整体排好序1.2 特点时间复杂度O(nlogn)空间复杂度O(nlogn)稳定2 实现2.1 递归public class MergeSort { public static void mergeSort(int[] arr) { if (arr == null || arr.length < 2) { return; } process原创 2020-05-17 02:43:55 · 262 阅读 · 0 评论 -
选择、冒泡、插入排序
0 介绍三种最简单、最基本的排序时间复杂度均为 O(n^2)空间复杂度均为 O(1)唯独直接选择排序是 不稳定 的1 直接选择排序思想:每次选择最小的值交换动图演示代码void selectionSort(int arr[]) { for (int i = 0; i < arr.length; i++) { int minIndex = i; for (int j = i + 1; j < arr.length; j++) {原创 2020-05-16 19:15:34 · 124 阅读 · 0 评论 -
必须知晓的位运算
1 位运算1.1 介绍位运算是对二进制数上的一元或二元操作比加减略快,比乘除快很多1.2 位运算符与(&):全1出1,有0出0或(|):全0出0,有1出1非(~):0变1,1变0异或(^):相同为0,不同为1(无进位加法)逻辑右移(>>):往右移动,左边补符号位逻辑左移(<<):往左移动,右边补0无符号右移(>>>):往右移动,右边补01.3 基本性质除以2n:x >> n乘2n:x << nn原创 2020-05-16 18:28:45 · 490 阅读 · 0 评论