
算法随笔
文章平均质量分 62
平时常用算法总结及常用算法模板整理
ranyh524
一个fw的自我救赎
展开
-
c++ getline()详解
etline()函数在c++中有两种用法,第一种定义在$$头文件中,第二种定义在$头文件中。getline()在这两种用法中都是用于读入一行字符串,可以带空格等特殊字符,在第二种用法中getline的第一个参数传的是`流`,比如:cin和stringstream原创 2022-12-06 17:55:06 · 14042 阅读 · 0 评论 -
c++ split 实现字符串分割
因为c++中没有split函数,所以可以使用getline和stringstream结合实现。原创 2022-12-06 17:54:19 · 2299 阅读 · 1 评论 -
粗略判断算法是否超时
一般评测机一秒最多可以运行 一亿次 即 10^8次。而一般编程竞赛都会将时间限制为 1000ms 即 1s。在这种情况下,C++ 代码的操作次数控制在 10e7~10e8为最佳。1000ms意味着O(n3)的算法,可以几百,一般题目给的数据范围为100。O(n2)的算法,可以几千,一般不到万,经常出现的就是数据范围1000。O(nlongn)或者O(n)的算法,最常见的数据范围就是为100000。下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择:参考:如何由数据原创 2022-03-05 21:47:13 · 1916 阅读 · 0 评论 -
经典排序算法总结(C++)
常见的分类算法还可以根据排序方式分为两大类:比较排序和非比较排序,比较排序就是常见的几种。 非比较排序的特点是时间复杂度很低,都是线性复杂度O(n),但是非比较排序受到的限制比较多,不是通用的排序算法,有如下几种: 1)计数排序(Count Sort)(复杂度O(n+k)(其中k是待排序的n个数字中最大值) 2)基数排序(Bucket Sort)(复杂度O(nk)(其中k是最大数字的位数) 3)桶排序(Radix Sort)(复杂度O(n+k)(其中k是待排序的n........原创 2022-03-04 22:42:13 · 519 阅读 · 1 评论 -
彻底搞懂回溯法(本文真的很详细)
目录回溯法理论基础组合问题组合问题转载于:https://zhuanlan.zhihu.com/p/302415065回溯法理论基础「回溯是递归的副产品,只要有递归就会有回溯」,所以回溯法也经常和二叉树遍历,深度优先搜索混在一起,因为这两种方式都是用了递归。回溯法就是暴力搜索,并不是什么高效的算法,最多再剪枝一下。回溯算法能解决如下问题:组合问题:N个数里面按一定规则找出k个数的集合 排列问题:N个数按一定规则全排列,有几种排列方式 切割问题:一个字符串按一定规则转载 2022-03-20 22:24:45 · 79025 阅读 · 21 评论 -
详解五种最短路径算法及其区别(c++)
目录一.朴素Dijkstra算法二.堆优化的Dijkstra三.bellman_ford算法四.spfa算法五.floyd算法总结: 算法基本思路:eg:1. 2.3. 4.红色表待定的4. 5. 6. 简单地说就是先找出一个距离起点最近的,然后再由这个距离起点最近的点更新别的点朴素dijkstra模板题:题目:https://www.acwing.com/problem/content/851/ 代码如下:二.堆优化的Dijkstra算法步骤和朴素算法一样,只是原创 2022-07-03 17:06:52 · 3395 阅读 · 0 评论 -
最全动态规划题型详解
通俗的讲动态规划(dp)的核心就是记住已经解决过子问题的解,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。dp常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所消耗的时间往往远小于朴素解法。原创 2022-11-17 20:54:35 · 7758 阅读 · 5 评论 -
拓扑排序 C++
在AOV网中,若不存在回路,则所有活动可排列成一个线性序列,使得每个活动的所有前驱活动都排在该活动的前面,我们把此序列叫做拓扑序列(不是唯一的),由AOV网构造拓扑序列的过程叫做拓扑排序...原创 2022-03-10 21:21:42 · 1059 阅读 · 0 评论 -
一文搞懂什么是一维差分
差分与前缀和相对,可以视为前缀和的逆运算。差分它可以维护多次对序列的一个区间修改一个数。类似于数学中的求导和积分。原创 2022-07-22 16:00:52 · 243 阅读 · 0 评论 -
双指针算法
什么是双指针双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,一般用于求数组的相关问题。对撞指针对撞指针是指在数组中,将指向最左侧的索引定义为左指针(left),最右侧的定义为右指针(right),然后从两头向中间进行数组遍历。当遇到连续数组和字符串时第一时间想到对撞指针解题能省一次for循环。伪代码如下:while(left<right){ left++; right原创 2022-03-06 09:28:56 · 641 阅读 · 0 评论 -
位运算求十进制转换二进制
步骤:1.先根据n的值判断此数的二进制位数(2的n次方)2.将此数二进制的最高为右移i位到最右边(n>>i)3.&1后输出(&1为了输出)#include<bits/stdc++.h>using namespace std;int main(){ int n = 10;//2^4=16所以10的二进制有4位 for(int = 3;i>=0;i--)//将此数二进制的最高为右移i位到最右边,&1后输出原创 2022-05-09 10:57:48 · 609 阅读 · 0 评论 -
二进制中1的个数
二进制中1的个数。原创 2022-07-22 16:30:43 · 116 阅读 · 0 评论 -
Ac自动机 c++
学会Ac自动机前提是要知道tire树和kmp的实现和原理原创 2022-08-30 21:30:19 · 887 阅读 · 2 评论 -
n皇后最简洁且易懂(c++)
题目如下:代码如下:如果看不懂下面回溯解法,请看#include<bits/stdc++.h>using namespace std;const int N = 20;int n;char g[N][N];//col一列是否用过,dg正对角线是否用过,udg反对角线是否用过 //udg和dg若为true则说明这两条对角线已经用过了不能再用了 bool col[N],dg[N],udg[N];void dfs(int u){ if(u == n) {原创 2022-05-29 09:24:54 · 184 阅读 · 0 评论