算法与数据结构
ACM、蓝桥杯、数据结构基础
ଳxin
Great design comes from thinking!
展开
-
AVL 平衡二叉树 - 待更新(在笔记本上)
一、引言:G.M. Adelson-Velsky 和 E.M. Landis ---- AVL树AVL满足的条件:1.它是一个查找二叉树(也称排序二叉树)2.每个节点的左右子树高度相差不能大于1。每次插入元素的过程中,如果遇到高度差大于1的情况。归纳为四种类型的自旋过程:LL RR 、 LR RL二、自旋过程(1) LL:...原创 2021-01-14 13:17:45 · 121 阅读 · 0 评论 -
最大回文子串DP
class Solution {public: string longestPalindrome(string s) { bool dp[1001][1001]; //初始化 memset(dp , false, sizeof(dp)); int len = s.length(); //最大长度 int maxLen = 1; //起始点 int indexFro...原创 2020-09-22 12:04:32 · 127 阅读 · 0 评论 -
快速排序 回顾
快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。 [2] (2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于..原创 2020-09-22 22:50:20 · 192 阅读 · 0 评论 -
选择排序 回顾
#include<iostream>using namespace std;int main() { int a[] = {1,5,3,2,0,23}; int n = 6 , t = 0; for(int i=0;i<n-1;i++) { int max_i = i ; //每一趟选最小的放到前面来 for(int j=i+1;j<n;j++) { if(a[j] < a[max_i]) { max_i = j; } } i.原创 2020-09-25 12:52:58 · 107 阅读 · 0 评论 -
插入排序 回顾
#include<iostream>using namespace std;int main() { int a[] = {5,4,7,2,9,1,77}; int n = 7; for(int i=1;i<n;i++) { int j=i; while(j>0 && a[j] < a[j-1]) { swap(a[j] , a[j-1]); j--; } } for(int i=0;i<n;i+...原创 2020-09-25 17:09:35 · 109 阅读 · 0 评论 -
快排伪代码
一、单向扫描法:#include<stdio.h>#include<iostream>using namespace std;void quickSort(int arr[],int p,int r){ int partition(int arr[],int p,int r); if(p<r){ int q=partition(arr,p,r); quickSort(arr,p,q-1); quickSort(arr,q+1,r); }}v原创 2020-10-28 10:23:51 · 3813 阅读 · 0 评论 -
大整数乘法思路
AB=2*A1B1*10^(n2+m2)+2*A2B2+(A1*10^n2-A2)*(B2-B1*10^m2)原创 2020-10-28 10:26:10 · 337 阅读 · 0 评论 -
图的应用(校园导航图最短路径求解)
实验要求:设计四川轻化工大学的校园平面图,所含景点不少于8个。以图中顶点表示学校内各景点,存放景点的名称、景点介绍信息等;以边表示路径,存放路径长度信息。要求将这些信息保存在文件graph.txt中,系统执行时所处理的数据要对此文件分别进行读写操作。1.从文件graph.txt中读取相应数据, 创建一个图,使用邻接矩阵表示图(算法6.1);2.景点信息查询:为来访客人提供校园任意景点相关信息...原创 2019-06-01 17:38:46 · 13975 阅读 · 34 评论 -
leetcode - 链表两数相加
给出两个非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807来源:力扣(LeetCode) /** * ...原创 2020-08-23 13:00:42 · 182 阅读 · 0 评论 -
冒泡排序 回顾
#include<cstdio>#include<iostream>using namespace std; int main() { int a[] = {5,4,7,2,9,1,77}; int n = 7; for(int i=0;i<n;i++) { for(int j=0;j<n-i-1;j++) { if(a[j+1] < a[j]) { int t = a[j]; a[j] = a[j+1]; a...原创 2020-09-22 23:54:15 · 576 阅读 · 0 评论 -
c++ set unordered_set区别
c++ set unordered_set区别c++ std中set与unordered_set区别和map与unordered_map区别类似:set基于红黑树实现,红黑树具有自动排序的功能,因此map内部所有的数据,在任何时候,都是有序的。 unordered_set基于哈希表,数据插入和查找的时间复杂度很低,几乎是常数时间,而代价是消耗比较多的内存,无自动排序功能。底层实现上,使用一个下标范围比较大的数组来存储元素,形成很多的桶,利用hash函数对key进行映射到不同区域进行保存。set使原创 2020-10-28 10:26:46 · 272 阅读 · 0 评论 -
费马小定理+欧拉函数
解法一:费马小定理求解乘法逆元若a是一个整数,b是一个质数,那么 ab ≡ a(mod b) 或 ab-1≡1 (mod b)由扩展欧几里得可以得出:因为gcd(a,b) == 1, ax ≡ 1(mod b) x是乘法逆元ab-1 = a*ab-2= ax ≡1(mod b). 所以 x = ab-2 就是乘法逆元。 我们可以通过快速幂求解。在本题求x = a9973-2。https://blog.csdn.net/qq_41280600/article/details/98372原创 2020-10-28 10:27:22 · 149 阅读 · 1 评论 -
Perfect Number[完数]
它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。如果一个数恰好等于它的因子之和,则称该数为“完全数”。#include<iostream>#include<time.h>#include<math.h>#define max 1e9using namespace std;//梅森素数//原理:如果(2^p-1)是素数,那么它就是梅森素数,再根据用(2^p-1) * 2^(p-1),这个就是完全数。bool Prime(int原创 2020-10-28 10:28:02 · 157 阅读 · 0 评论 -
背包问题[dp表][01、多重、完全背包]
一、01背包:/*对于物品i,此时我们的背包有两种状态,选或不选:1.如果选择物品i装入背包,则需要背包留出weight[i]的重量来容纳物品i,那么若想让dp[i][j]最大,则只需让dp[i-1][j-weight[i]]最大(即前i-1件物品,使得背包容量为j-weight[i]时价值最大);2.如果不选择物品i装入背包,则显然dp[i-1][j]最大,便能使得dp[i][j]最大化;于是得到了0/1背包问题的状态转移方程:dp[i][j]=max{d[i-1][j], dp[i-1原创 2020-10-28 10:29:49 · 429 阅读 · 0 评论 -
POJ 3617-字典序列
一、Java:import java.util.Scanner;public class Main{ //采用的是翻转字符串进行比较的方法,所以来说这个方法更加简单地比较字符串 public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); StringBuilder ss = new String原创 2020-10-28 10:30:34 · 256 阅读 · 0 评论 -
POJ-1850和POJ-1496[word index](组合数学-字母串序号)
解题一//转自牛客网链接:https://www.nowcoder.com/questionTerminal/c9188bc172ff40dc9b8bc1edfe6e3212来源:牛客网#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;char st[15];int com(int n, int..原创 2020-10-28 10:31:45 · 194 阅读 · 0 评论 -
最大子段和(算法)
给定一个数组,求最大的一段子段的和:如: num = {-5,12,3,-8,2,-9} 最大的子段和为9int sum = 0;for (int i = 0; i < N; i++) { if(sum + num[i] < 0) { sum = 0;//若sum小于0 那么之前的一段就不要了 } else { sum += num[i]; } ans = max(ans, sum);//ans保存每一次正数连续子串,有更原创 2020-10-28 10:33:18 · 306 阅读 · 0 评论 -
codeforces-A. Equation
Let's call a positive integer composite if it has at least one divisor other than 1 and itself. For example:the following numbers are composite: 1024, 4, 6, 9;the following numbers are not composi...原创 2019-12-21 19:52:54 · 251 阅读 · 0 评论 -
子集和问题-dfs回溯法
#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int maxv=1e5+5;int n=0,res=0;int a[maxv];int b[maxv];int vis[maxv];int flag=0;void dfs(int ...原创 2019-12-19 10:16:17 · 288 阅读 · 0 评论 -
会场安排问题-贪心思想
#include<iostream>#include<cstring>#include<algorithm>using namespace std; struct meet{ int s; int e;}; bool cmp(meet a,meet b){ return a.e<=b.e;} int n;b...原创 2019-12-19 09:49:35 · 129 阅读 · 0 评论 -
DFS-地下停车场
题目描述小明在一个地下停车场入口,停车场有若干个路口,每个路口号码为1~n。每个路口有3个方向,左,前,右。小明在入口,即第一个路口,他要去的路口的号码是m。小明沿着路口的指示牌,能走到他要去路口吗?输入多组数据,每组数据n+2行。第一行为一个正整数n代表路口的个数,之后n行,这n行中的第i行为第i个路口的向左路口、向前路口、向右路口(0表示无路)。最后一行为一个正整数m代表出口路...原创 2019-12-09 22:07:40 · 121 阅读 · 0 评论 -
2019-CCPC-网络赛-1001 ^&^
题目分析:找出最小的值c使(a^c)&(b^c)最大。代码:#include <stdio.h>#include <algorithm>using namespace std;int main(){ long long a, b; int t; scanf("%d", &t); while(t--){ scanf("%lld%ll...原创 2019-08-24 10:21:19 · 297 阅读 · 0 评论 -
算法训练 之 2019-CCPC网络赛-1007 Windows Of CCPC
输入和输出用例:解题思路:用递归。n=1时,左下角那个P和其余3个C。n=2时,用n=1时的图形拼成n=2的图形,但是:左下角和n=1的图形相反(C变为P,P变为C),其余则相同。代码:#include<stdio.h>#include<math.h>void f(int n, int s, int t){ i...原创 2019-08-24 11:10:33 · 411 阅读 · 0 评论 -
HDU6440-Dream-CCPC2018网络赛
HDU:http://acm.hdu.edu.cn/showproblem.php?pid=6440Problem DescriptionFreshmen frequently make an error in computing the power of a sum of real numbers, which usually origins from an incorrect equa...原创 2019-08-23 09:43:25 · 236 阅读 · 0 评论 -
HDU1787-欧拉函数的简单应用
HDU:http://acm.hdu.edu.cn/showproblem.php?pid=1787欧拉函数:φ(n)表示从1~n-1中有多少个数与n互素。φ(1) = 1我们首先应该要知道欧拉函数的通项公式:φ(n)=n*(1-1/p1)*(1-1/p2)*(1-1/p3)*(1-1/p4)…..(1-1/pn),其中pi为n的质因数#include<iostream>...原创 2019-08-21 11:23:32 · 182 阅读 · 0 评论 -
HDU3501-Calculation 2-欧拉函数的性质的应用
HDU:http://acm.hdu.edu.cn/showproblem.php?pid=3501性质①:N>1,不大于N且和N互素的所有正整数的和是 ( n*(n-1)/2 - n*eular(n)/2 ) % mod。#include<iostream>#include<cmath>using namespace std;//求单个数的欧拉函数...原创 2019-08-21 12:01:48 · 123 阅读 · 0 评论 -
算法训练 - HDU1232-畅通工程[并查集入门]
HDU:http://acm.hdu.edu.cn/showproblem.php?pid=1232Problem Description:某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?Input:测...原创 2019-08-21 19:52:46 · 203 阅读 · 0 评论 -
算法 - InsertSort [插入排序]
#include<iostream>#include<cstring> using namespace std;//1,2,3,4,5,4.5// k//插入排序 void insertsort(double a[],int k){ if(k==0) return ; insertsort(a,k-1); //对前k-1个元素排...原创 2019-08-17 17:00:00 · 253 阅读 · 0 评论 -
趣味-配偶-匈牙利算法
首先百度百科,了解一下匈牙利算法思想 : 根据一个匹配是最大匹配当且仅当没有增广路,求最大匹配就是找增广轨,直到找不到增广轨,就找到了最大匹配。遍历每个点,查找增广路,若找到增广路,则修改匹配集和匹配数,否则,终止算法,返回最大匹配数。匈牙利算法分析:时间复杂度--邻接矩阵:最坏为O(n^3) ;邻接表:O(n*m)空间复杂度--邻接矩阵:O(n^2) ...原创 2019-08-27 09:47:27 · 267 阅读 · 0 评论 -
CCPC网络赛-2019-Shuffle Card
题意分析:开始给出一个排列(n个数),然后m次操作,把数x移动到最前面,求最后的排列。正确代码在最后...我的思路:首先想的是数组模拟链表,输入一个就串联前驱和后驱(数组的指向,用下标和值来模拟对应),但是表示较麻烦,果断换思路。........................................................接着:想到集合,其次是栈。关键是...原创 2019-08-24 10:03:09 · 617 阅读 · 0 评论