数据结构和算法
文章平均质量分 53
数据结构和算法
Hevttc_Cao
万丈高楼平地起,勿在浮沙筑高台
展开
-
LeetCode 371.两整数之和
题目描述:给你两个整数 a 和 b ,不使用 运算符 + 和 -,计算并返回两整数之和。class Solution { public int getSum(int a, int b) { if(a == 0) return b; if(b == 0) return a; int sum = a ^ b; int carry = (a & b) << 1; return getSu原创 2021-09-26 18:34:38 · 77 阅读 · 0 评论 -
LeetCode 583.两个字符串的删除操作(动态规划)
题目描述:给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。提示: 1.给定单词的长度不超过500500500。 2.给定单词中的字符只含有小写字母。动态规划(最长上升子序列)时间复杂度:O(n原创 2021-09-25 17:08:41 · 69 阅读 · 0 评论 -
LeetCode 38.外观数列(双指针)
题目描述:给定一个正整数 nnn ,输出外观数列的第 nnn 项。「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。可以将其视作是由递归公式定义的数字字符串序列:countAndSay(1) = "1"countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串。前五项如下111211211111221第一项是数字 1描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 “11”描述前一项,这个数原创 2021-09-24 21:43:25 · 67 阅读 · 0 评论 -
Leetcode 24.两两交换链表中的节点
题目描述:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例:提示:链表中节点的数目在范围[0,100][0,100][0,100]内0<=Node.val<=1000<=Node.val<=1000<=Node.val<=100解释:一、创建一个虚拟头节点dummy指向head二、步骤一对应的就是dummy.next = b三、步骤二对应的就是a.next = b.原创 2021-09-23 19:54:10 · 69 阅读 · 0 评论 -
Leetcode 19.删除链表的倒数第N个节点
题目描述给你一个链表,删除链表的倒数第 nnn 个结点,并且返回链表的头结点。算法分析:一、 创建虚拟节点dummy,dummy指向head.next二、 指针p1是快指针,p2是慢指针,首先让俩指针都指向第一个节点,p1指针先走n步,然后俩指针一起走,直到p1指针走到头,这时候p2指针就到了第L-n的位置了,也就是我们要删除位置的前一个位置三、 然后让当前位置的next指针指向下下个位置代码:/** * Definition for singly-linked list. * pu原创 2021-09-22 21:54:45 · 66 阅读 · 0 评论 -
信竞卡常代码
#pragma GCC optimize(3)#pragma GCC optimize("Ofast")#pragma GCC optimize("inline")#pragma GCC optimize("-fgcse")#pragma GCC optimize("-fgcse-lm")#pragma GCC optimize("-fipa-sra")#pragma GCC optimize("-ftree-pre")#pragma GCC optimize("-ftree-vrp")#p转载 2021-01-10 10:19:53 · 135 阅读 · 0 评论 -
2021年寒假程序设计训练-----2021/01/03
能量项链描述在MarsMarsMars星球上,每个MarsMarsMars人都随身佩带着一串能量项链。在项链上有NNN颗能量珠。能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数。并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定等于后一颗珠子的头标记。因为只有这样,通过吸盘(吸盘是MarsMarsMars人吸收能量的一种器官)的作用,这两颗珠子才能聚合成一颗珠子,同时释放出可以被吸盘吸收的能量。如果前一颗能量珠的头标记为mmm,尾标记为rrr,后一颗能量珠的头标记为rrr,尾标记为nnn,则聚原创 2021-01-03 14:30:44 · 169 阅读 · 0 评论 -
2021寒假程序设计训练----2021/01/02
医院设置题目描述设有一颗二叉树如图:其中,圈中的数字表示结点中居民的人口。圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻接点之间的距离为 1。如上图中,若医院建在1 处,则距离和 =4+12+2×20+2×20=1364+12+2 \times 20+2\times20=1364+12+2×20+2×20=136;若医院建在 3 处,则距离和 =4×2+13+20+40=814×2+13+20+40=814×2+13+20+40=81。输入原创 2021-01-02 21:00:24 · 204 阅读 · 0 评论 -
2021年寒假程序设计训练----2021/01/01
一、珠心算测验描述珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练, 既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和?最近老师出了一些测验题,请你帮忙求出答案。输入格式输入共两行,第一行包含一个整数 n,表示测试题中给出的正整数个数。第二行有 n 个正整数,每两个正整数原创 2021-01-02 10:57:18 · 205 阅读 · 0 评论 -
扩展欧几里得算法
题目描述给定n对正整数,对于每对数,求出一组xi,yix_i,y_ixi,yi ,使其满足aixi+biyi=gcd(ai,bi)a_ix_i+b_iy_i=gcd(a_i,b_i)aixi+biyi=gcd(ai,bi)。输入格式第一行包含整数n。接下来n行,每行包含两个整数ai,bia_i,b_iai,bi输出格式输出共n行,对于每组ai,bia_i,b_iai,bi,求出一组满足条件的xi,yix_i,y_ixi,yi,每组结果占一行。本题答案不唯一,输出任意原创 2020-12-28 21:51:40 · 103 阅读 · 0 评论 -
并查集(非常好写的数据结构)
写在前面在学习并查集之前先了解这样一个小故事吧 在一个军营中,有很多不同的部队,一个部队中有数量不等的。但是战争总是一触即 发的。那么总司令怎么号召全员做好战队准备呢。这就得从上级一级一级往下给首长 发通知了,每个等级的首长负责通知他们的部队,这样就做到了,临危不乱。能够及 时做好战斗准备。算法用途解决集合的动态连通性问题基本操作并查集的初始化void init() { //刚开始每个点都是一个集合 for (int i = 1; i <= n; i ++ ) p[原创 2020-10-22 22:07:04 · 103 阅读 · 0 评论 -
Leetcode109 有序链表转换二叉搜索树
思路:把链表的节点存进vector,然后二分找中点即可。注意:合法的二叉搜索树不止一个,不一定和样例一样。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * .原创 2020-08-19 08:54:11 · 93 阅读 · 0 评论 -
Leetcode110 平衡二叉树
思路:首先作为一颗平衡二叉树,它的左右子树肯定也是平衡二叉树。那么我们可以递归判断左右子树是否是高度平衡的,不是直接返回false即可,如果是平衡的,再往下递归判断左右子树是否是平衡的。递归到NULL时,说明是平衡的,返回true即可如何判断是否是平衡二叉树:只要左右子树最大深度的绝对值之差不超过1,就是平衡二叉树,否则返回falseif (abs(get(root->left)-get(root->right))>1) ans = false;注意:刚开始树可能为空树,判断一.原创 2020-08-19 08:17:25 · 95 阅读 · 0 评论 -
最短路板子--------笔记
堆优化的Dijkstra算法Dijkstra求最短路#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <queue>using namespace std;const int N = 150010;typedef pair<int,int> PII;int h[N],idx;int d[N];i原创 2020-08-18 11:19:59 · 107 阅读 · 0 评论 -
笔记-----链式前向星的板子
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int N = 1e5+10;int head[N],idx;struct Edge{ int next;//当前点所指向的下一个点 int to; //边所指向的点 int val; //边的权值}edge[N];原创 2020-08-15 21:25:16 · 160 阅读 · 0 评论 -
DFS-深度优先搜索
DFS(深度优先搜索)什么是DFS:DFS算法是一种搜索算法,而搜索算法其实是枚举的一类,有目的的枚举一个问题的解,并不是盲目的枚举。原理:DFS是递归的一种,也可以理解为递归,没必要区分得太开,DFS算法其实是一棵递归搜索树,从根节点出发,尽可能往深处搜,直到遇到叶节点为止。叶节点搜索完了,就开始回溯到它的父节点,再开始搜索它的父节点的子节点(如果存在的话)。这里给出DFS的·一般伪代码void dfs(int u) //u是递归搜索树的层数{ if (满足条件) {原创 2020-07-09 13:26:59 · 105 阅读 · 0 评论 -
快速幂
int qmi(int a,int k,int p) //a^k%p{ int res = 1; while(k) { if (k&1) res = (LL)res*a%p; k>>=1; a = (LL)a*a%p; } return res;}原创 2020-07-05 14:46:29 · 85 阅读 · 0 评论 -
筛法求欧拉函数
#include <iostream>using namespace std;const int N = 1000010;typedef long long ll;int prime[N],cnt,phi[N]; //prime[N]存素数,phi[N]计算欧拉函数bool st[N]; //筛素数ll euler(int n){ phi[1]=1; for (int i = 2 ; i <= n ; i++){ if (!st[i])原创 2020-07-05 14:44:04 · 2308 阅读 · 0 评论 -
筛素数的三种算法复杂度比较
给定一个正整数n,请你求出1~n中质数的个数。输入格式共一行,包含整数n。输出格式共一行,包含一个整数,表示1~n中质数的个数。数据范围1≤n≤10^6输入样例:8输出样例:4#include <iostream>using namespace std;const int N = 1e6+10;int prime[N], cnt;bool st[N];...原创 2020-02-28 10:36:14 · 682 阅读 · 0 评论 -
数组模拟栈
题目链接 Acwing 828模拟栈#include <iostream>using namespace std;const int N = 100010;int e[N],idx; //e[N]模拟栈 , idx表示栈里的元素数量void add_top(int x) //弹入元素{ e[++idx] = x;}void delete_top() //弹出栈顶元素{ idx--;}int main (){ int m,x;原创 2020-05-14 15:45:07 · 117 阅读 · 0 评论 -
数组模拟单链表
题目链接 Acwing 826单链表#include <bits/stdc++.h>using namespace std;const int N = 1e5+10;//head表示头结点的下标,e[i]表示节点i的值,ne[i]表示节点i的下一个的位置,index表示正在用哪个点int e[N] , ne[N] , head , idx; //初始化void init(){ head = -1; //head指向空节点 idx = 0;原创 2020-05-14 15:49:15 · 141 阅读 · 0 评论 -
栈应用 : 中缀表达式转后缀表达式求值
中缀表达式(或中缀记法)是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法。与前缀表达式(例:+ 3 4)或后缀表达式(例:3 4 +)相比,中缀表达式不容易被计算机解析,但仍被许多程序语言使用,因为它符合人们的普遍用法。确实,中缀表达式很符合人类的思想,但是让计算机理解起来却不那么容易,这里我们引进了后缀表达式后缀表达式(也成为逆波兰表达式)一个表达式E的后缀形式可以如下定义:(1)如果E是一个变量或常量,则E的后缀原创 2020-06-18 20:34:48 · 647 阅读 · 0 评论 -
高精度算法(c++)
简单模拟一下小学竖式加法即可那么何为高精度呢,简单来说就是处理 long long都处理不了的数据,既然long long存不了,那我们就用字符串存啦- 。 -精髓1.我们可以用两个整型数组存字符数组的每一位,然后比较两个数组的长度,取最大的那个。存的时候一般倒着存(从低位到高位,因为整数没有除个位以下的数位,但你的最高位还可以进位,那么你就又要开一个位置来存这个新的最高位)。for (...原创 2020-03-24 17:11:31 · 738 阅读 · 3 评论 -
快排
快速排序模板c++代码这里运用了分治思想和双指针算法## 快排# include <iostream># include <cstdio># include <algorithm>using namespace std;const int N = 100010;int n;int q[N];void quick_sort(int l,...原创 2020-02-24 18:09:44 · 313 阅读 · 0 评论