算法
暮色_年华
这个作者很懒,什么都没留下…
展开
-
关于算法时间复杂度的一些理解
如果一个算法仅涉及对整个向量应用一条向量指令(如向量加法、乘法等),且该指令能在一个固定的、与向量长度无关的时钟周期数内完成对向量所有元素的并行处理,则该操作的时间复杂度可以视为O(1)。这些操作可能需要遍历整个向量,即使在向量处理器上并行执行,其时间复杂度仍可能与向量长度成正比,即O(n),其中n为向量长度。正常的话时间复杂度是O(logn),但是在linux操作系统中使用一个数据结构来缓存这个节点,在更新红黑树的时候维护这个节点,所以要访问的时候就是O(1)。算法复杂度的分析需要结合实际问题来看。原创 2024-04-27 11:54:36 · 165 阅读 · 0 评论 -
【蓝桥杯】蓝桥杯日期类问题总结
判断闰年:bool judge(int year){ if(year%400==0||(year%100!=0&&year%4==0)) { return true; } return false; } 判断日期合法性 int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};bool judge(int year){ if(year%400==0||(year%100!=0&&year%4=原创 2022-03-03 21:36:19 · 213 阅读 · 0 评论 -
动态规划:背包问题合集
定义dp[i][j]:在前i件物品中选出若干件,放入容量为j的背包,能获得的最大价值。考虑第i件物品拿还是不拿。讨论c[i]与背包容量的关系:(1)j < c[i] 时,背包容量为j,而第i件物品重量大于j只能选择不拿:f[i][j] = f[i-1][j]( 2) j >= c[i] 时,背包可以拿可以不拿第i个物品。原创 2024-04-08 16:44:06 · 1064 阅读 · 0 评论 -
算法整理:二分查找
在集合搜索特定值的过程,每次比较之后将查找空间。要查找的值当前位置维持查找空间的指标用来确定向左查还是向右查的索引二分查找维护left,right,mid,并将target和索引为mid的值进行比较;如果条件不满足或值不相等,则清除目标不可能存在的那一半,并在剩下的一半继续查找,直到成功为止第二种情况:右面第一个符合条件的下标。注意讨论r=n-1的情况。如果没有数符合条件,那么r最终就停在n-1的位置。给定一个数组,需要判断数组长度。比如访问到idx-1和idx+1时,长度必须大于等于3.原创 2024-04-01 19:24:02 · 481 阅读 · 1 评论 -
算法整理:滑动窗口
每次for循环,i++,表示i指针向后移动一位,while是找和 i 匹配,在i左面最远的合法 的下标 j。(如果求最小值,那 么 while 就是找和 j 匹配,在i左面最近的合法下标 j)所以 while 循环的作用是在i向右移动一位后,使滑动窗口合法,在滑动窗口合法后更新答案。先把这个模板写下来,然后再想每道题目如何做。双指针算法的本质:优化循化O(n2)优化为O(n)性质:i,j的移动一般具有单调性。i向后移动时,j只能向后移动或者时不动,不能向前移动。原创 2024-03-31 21:31:37 · 593 阅读 · 0 评论 -
算法整理:排序
快速排序首先不妨以第一个数为基准数,在一轮遍历后,使基准数左边的数都小于基准数,基准数右边的数都大于基准数。当然也可以取中间的数为基准数。i,j相遇时,枢轴通常会被放置在两个指针相遇的位置上。原创 2024-03-31 18:35:51 · 570 阅读 · 0 评论 -
算法整理:链表
注意:1.删除节点需要dummyNode 2.最后返回的是dummyNode.next而不是head.while停止后,p为null,cnt为对应到最后一个节点上面。//cnt与p不同步对应。规律:开始的时候同步和结束时候的同步规律是一致的。(2)长的链表走|n1-n2|步,使两个链表长度相同。(3)两个链表一起走,相等返回,走到头返回null。(1)fast和slow置头结点,速度为2,1。(1)求两个链表长度n1,n2。原创 2024-03-31 13:20:54 · 614 阅读 · 0 评论 -
【数据结构和算法】最短路径:朴素dijkstra算法
第k次迭代S外距离源点最短的点为j,j在前k-1次迭代的时候就进行过松弛操作,而s外的点除j外到源点的距离都比j大,所以不可能出现经过s外点到j的最短路径,所以第k次迭代dist[j]就是源点到j的最短路径。dij算法每次把s外距离源点的最小值加入s中(这个距离就是源点到该点的最短距离),这是贪心算法。使用这个点来进行松弛操作(命题),来更新S外点到源点的最短距离。假设第k-1次迭代后s中顶点最短路径是dist数组中的值,第k次迭代要要找s外距离源点最短的点,并对所有点进行松弛操作。原创 2023-07-26 19:46:16 · 74 阅读 · 0 评论 -
算法题整理:bfs
对于100%的数据N原创 2024-03-27 23:02:58 · 300 阅读 · 0 评论 -
【最短路径问题笔记】SPFA算法及负环的判断
dis数组:记录源点到每个结点最短路径值in数组:记录结点进队次数vis数组:记录结点是否在队列中设立队列用来保存待优化的结点:优化时每次取出队首结点cur,并且用cur点当前的最短路径对u点邻结点v进行松弛操作(dis[cur]+w<dis[v] 经过cur到v的距离小于dis[v])如果v点的最短路径估计值有所调整,且v点不在当前的队列中,就将v点放入队尾。这样不断从队列中取出结点来进行松弛操作,直至队列空为止伪代码:...原创 2022-02-10 01:03:26 · 487 阅读 · 0 评论 -
【最短路径问题】计蒜客:圣诞树
以每个节点为起点,求到根节点的最短路,所有 最短路*权值 加起来即为结果。解释如图实现用迪杰斯特拉 算法代码:#include<iostream>#include<vector>#include<cstring>using namespace std;int w[50001];struct node{ int v; int w; node(int _v,int _w){ v=_v; w=_w; }};...原创 2022-02-09 22:40:53 · 272 阅读 · 0 评论 -
【java笔记】数组概念初始化及相关操作
数组概念:是一种容器,可以同时存放多个数据值数组特点:1、数组是一种引用数据类型2、数组当中的多个数据,类型必须统一3、数组的长度在程序运行期间不可改变数组的初始化:在内存中创建一个数组,并且向其中赋予一些默认值两种常见的初始化方式:1、动态初始化(指定长度):在创建数组的时候,直接指定数组当中数组元素的个数2、静态初始化(指定内容)在创建数组的时候,不直接指定数据个数多少,而是直接将具体的数据内容进行指定动态初始化数组的格式:数据类型 [ ]数组名称原创 2022-02-08 16:08:50 · 382 阅读 · 0 评论 -
【数据结构和算法笔记】分别用vector数组和链表实现图的邻接表
原创 2022-01-26 23:04:06 · 279 阅读 · 0 评论 -
【动态规划笔记】区间dp:括号匹配(删除字符和括号匹配)
代码://区间dp:括号匹配 #include<iostream>#include<string>#include<string.h> using namespace std;//同分果子,一个区间的结果由两个区间合并得到,讨论最优分割点//记忆化搜索 string s;int dp[7][7];int f(int i,int j){ if(i>=j)return 0; if(dp[i][j]!=-1)ret...原创 2022-01-24 13:46:16 · 261 阅读 · 0 评论 -
蓝桥杯:BFS解决问题总结(九宫重排,跳蚱蜢,卡片交换)
BFS标志:初始状态经过演变到达目标状态,问最少经过几步如九宫重排问题跳蚱蜢问题:卡片交换问题:解题模板:不同题目的move函数和move函数的个数不同,其他都是相同的struct state{ string s; int level;}set<string>allstate;queue<state>q;string move(string s,int flag){str...原创 2022-01-18 16:15:45 · 3760 阅读 · 0 评论 -
蓝桥2017真题剪邮票
考点:利用next_permutation+映射 求n个元素的集合中选m个组合//数组的个数是集合中元素的个数,1的个数为选出元素的个数vector<int>a({0,0,...,1,1,...1});void f(vector<int>a){ for(int i=0;i<a.size();i++) { if(a==1) { //选F(i) } } }do{ f(a);//a通过f映射为集合元.原创 2022-01-18 00:28:48 · 205 阅读 · 0 评论 -
【离散数学笔记】计数原理:解决计数问题的基本方法
原创 2022-01-17 11:10:19 · 580 阅读 · 0 评论 -
leetcode 并查集 547.省份数量/200岛屿数量
【数据结构和算法笔记】用并查集求解等价关系_m0_52043808的博客-CSDN博客模板:class UF{private: vector<int>father;//father数组 vector<int>rank;//秩 int count;//连通分支数public: UF()//构造函数初始化并查集,元素各自成营 { father.assign(n,0); rank.assign(n,0); for :每个元素 {原创 2022-01-16 17:58:09 · 117 阅读 · 0 评论 -
【数据结构和算法笔记】用并查集求解等价关系
模板:class UF{private: vector<int>father;//father数组 vector<int>rank;//秩 int count;//连通分支数public: UF()//构造函数初始化并查集,元素各自成营 { father.assign(n,0); rank.assign(n,0); for :每个元素 { fathe...原创 2022-01-16 17:46:18 · 201 阅读 · 0 评论 -
蓝桥杯2014c++真题:扑克序列(next_permutation)
string s=" xxxx";sort(s.begin(),s.end());do{//处理s }while(next_permutaion(s.begin(),s.end()));注意:必须先排序后才能用next_permutation#include<iostream>#include<string>#include<sstream>#include<algorithm>#include<unordered_m...原创 2022-01-15 22:39:09 · 737 阅读 · 0 评论 -
蓝桥c++2013真题:前缀判断(代码填空)
答案:*(needle++)!=*(haystack++)或者*needle++!=*haystack++代码填空复制到编辑器里运行母串haystack_start,子串needle_start母串的头指针haystack子串的头指针needle两个同时遍历并判断是否相等,不相等返回NULL如果needle越界说明子串比母串长,返回NULL否则返回母串的头指针...原创 2022-01-15 10:56:31 · 94 阅读 · 0 评论 -
蓝桥杯日期填空问题:高斯日记/星系炸弹
思路:excel辅助计算用1791年12月15日作为基准计算结果距离1791-12-15有8113-5343=2770天1791-12-15距离1792有16天2770-16=2754从1792-1-1算起一共有2754天我们知道2000年是闰年,1996年是闰年,用excel的自动扩充求出自1792开始的闰年结果在1798-1799直接结果从1799-1-1算起有197天,可以得出结果为1799-07-16第一次做题:12’ 通过...原创 2022-01-14 21:19:40 · 196 阅读 · 0 评论 -
【数据结构和算法笔记】遍历生成树
对于非连通图,每个连通分量中的顶点集合遍历走过的边构成一棵生成树,各个连通分量的生成树组成非连通图的生成森林。原创 2021-12-26 12:05:35 · 196 阅读 · 0 评论 -
【数据结构和算法笔记】递归详解(附题)
一个递归模型由递归出口(3)和递归体(2)组成汉诺塔问题:递归设计:递归与栈:递归转为非递归:原创 2021-12-24 22:18:54 · 2293 阅读 · 0 评论 -
【数据结构和算法笔记】KMP算法介绍
BF暴力算法:KMP算法简介:原创 2021-12-23 19:22:29 · 589 阅读 · 0 评论 -
【数据结构和算法笔记】串详解:c实现
顺序串:非紧缩格式:每个字只存一个字符 紧缩格式:每个字存放多个字符操作与顺序表操作类似原创 2021-12-23 16:15:04 · 544 阅读 · 0 评论 -
【数据结构和算法笔记】队列(Queue)详解:c实现
队列简称队,是一种操作受限的线性表当rear==MaxSize -1时,队列中可能还有空位置,造成假溢出。解决办法:环形队列,用取余的方法实现链队类型声明:...原创 2021-12-23 15:44:01 · 723 阅读 · 0 评论 -
1432: 【蓝桥杯】:剪格子(迷宫问题变体)
注意输入:m表示宽度,n表示高度(m表示列,n表示行)dfs:从左上角开始走迷宫,如果走过路径的和为SUM/2,记录走过数字个数求走过数字的最小值代码:#include<iostream>using namespace std;const int MAX=15;int n,m;int size,sum,now,ans=100;int map[MAX][MAX];//图作为全局变量 int vis[MAX][MAX];//防止走回头路 ,作为全局...原创 2021-12-16 21:39:21 · 1781 阅读 · 0 评论 -
【蓝桥杯】题目 1429: 兰顿蚂蚁
思路:模拟 #include<iostream> #include<vector> #include<string> using namespace std; int main() { int row,line; cin>>row; cin>>line; vector<vector<int>>mat(row,vector<int>(line,0)...原创 2021-12-15 23:57:29 · 2294 阅读 · 0 评论 -
蓝桥杯1427: -买不到的数目(百钱百鸡问题变体)
百钱白鸡问题:公鸡5钱一只,母鸡3钱一只,小鸡1钱3只。100钱买100只鸡,问公鸡,母鸡,小鸡各几只?问题实质是求不定方程的整数解(数论):a+b+c=100①5a+3b+c/3=100②思路:穷举法(暴力搜索)方程②可变形为15a+9b+c=300,这样做可以防止出现整数除问题]a的可能取值范围是[0,20],b的可能取值范围是[0,33],c的可能取值范围是[0,100]可以用三个for循环遍历abc判断①②是否都成立优化:当a,b确定时,c=100-a-b原创 2021-12-15 20:43:33 · 2227 阅读 · 0 评论 -
LeetCode 437. 路径总和 III
437. 路径总和 III思路:深度优先搜索,暴力搜索:递归遍历每一个节点的所有可能路径,然后将这些路径书目加起来即为返回结果首先定义rootSum(p,val)表示以节点p为起点向下且满足路径总和为val的路径数目。对二叉树的每个节点求出 rootSum(p,target),然后对这些路径数目求和即为返回结果问题转化为以p为根节点 路径之和为targetSum的路径有多少条?递归(深度优先搜索,暴力搜索) int rootSum(p,targe...原创 2021-12-13 23:47:30 · 686 阅读 · 0 评论 -
【数据结构和算法笔记】插入排序(直接插入排序,折半插入排序,希尔排序)
插入排序(直接插入排序,折半插入排序)原创 2021-12-13 17:18:56 · 846 阅读 · 0 评论 -
leetcode 35. 搜索插入位置(二分法搜索失败的情况)
35. 搜索插入位置思路:二分查找模板:如果查找成功,返回target在nums中的下标//二分查找模板//nums[0..n-1]为有序数组,target为目标int left=0;int right=n-1;while(left<=right){ if(nums[mid]==target) { return mid; } else if(nums[mid]>target) { right=mid-1; } .原创 2021-12-13 17:06:53 · 647 阅读 · 0 评论 -
leetcode 129. 求根节点到叶节点数字之和
129. 求根节点到叶节点数字之和思路:转换为求二叉树根节点到叶子节点所有路径问题vector<vector<int>>path(TreeNode *root);#求根节点root到叶子节点所有路径,存放在二维数组中 递归:(后序遍历)先求出左子树到叶子节点的所有路径,再求出右子树到叶子节点的所有路径最后把根节点加入左右子树的路径后伪代码if root==...原创 2021-12-12 10:55:49 · 191 阅读 · 0 评论 -
【数据结构和算法笔记】排序(1)排序概述
原创 2021-12-11 15:25:03 · 303 阅读 · 0 评论 -
【数据结构和算法】哈希表详解
构造哈希表,解决哈希冲突原创 2021-12-09 20:29:53 · 521 阅读 · 0 评论 -
单调栈:leetcode 84. 柱状图中最大的矩形/85最大矩形
84. 柱状图中最大的矩形遍历数组,以每一个元素作为高,向左右两边拓展,遇到第一个比该元素小的位置停下图片源自leetcode力扣一.暴力解法(超时)遍历数组,以每一个元素作为高,向左右两边拓展,遇到第一个比该元素小的位置停下时间复杂度O(n*n)空间复杂度O(1)代码:class Solution {public: int largestRectangleArea(vector<int>& heights) {//最大面积,初...原创 2021-12-09 16:31:05 · 1103 阅读 · 0 评论 -
【leetcode刷题笔记】单调栈
求左边第一个比当前元素小的数代码:#include<iostream>using namespace std;#include<stack>int main(){ //定义单调栈st stack<int>st; //输入元素个数 int n; cin >> n; for (int i = 0; i < n; i++) {...原创 2021-12-08 20:32:23 · 354 阅读 · 0 评论 -
用c++实现一个插入,删除和随机访问都是O(1)的容器(剑指||30)
要求: 设计一个支持在平均时间复杂度 O(1)下,执行以下操作的数据结构:●insert(val): 当元素 val 不存在时返回 true,并向集合中插入该项,否则返回 false 。●remove(val):当元素 val 存在时返回 true,并从集合中移除该项,否则返回 false。●getRandom: 随机返回现有集合中的一项。每个元素应该有相同的概率被返回。思路:插入,删除时间复杂度为O(1)→哈希表 哈希表key存放元素值,val...原创 2021-12-06 23:05:41 · 1425 阅读 · 1 评论 -
【数据结构和算法笔记】用c和c++分别实现二叉搜索树
目录二叉排序树(二叉搜索树)定义:二叉排序树的性质:二叉排序树的操作:c语言实现二叉排序树:C++实现二叉排序树:二叉排序树(二叉搜索树)定义:二叉排序树的性质:(1)二叉排序树的中序遍历序列是递增的 推论:只给出二叉排序树的后序/前序序列,可以唯一确定二叉排序树(2)根最左下节点值最小,根最右下节点值最大二叉排序树的操作:1在二叉排序树中查找一个元素k: 过程类似于二分查找:如果mid=k,返回mi...原创 2021-12-06 21:40:36 · 755 阅读 · 0 评论