数据结构与算法
瓜子小店
这个作者很懒,什么都没留下…
展开
-
poj 3126 prime path BFS+素数筛打表
题目大意:给出两个四位素数,求一个素数转化为另外一个素数需要多少步,一次只能转换一个数,并且转换之后的另外一个数也为素数。直接给出代码,在poj中好像AC不了,之后会更新修改后AC的代码#include<iostream>#include<cstring>#include<queue>using namespace std;//#define myteststruct node{ int x,step;};bool vis[10010],flag[.原创 2021-07-13 22:07:22 · 241 阅读 · 1 评论 -
最长回文子串,输出此子串(leetcode 5)
题目描述: 给你一个字符串s输出其含有的最长的回文字符串样例:ASDZCSZXXZSCZQWSA输出:原创 2021-05-28 20:43:27 · 99 阅读 · 0 评论 -
Manacher(寻找最长回文子串,笔记用)
题目描述;给你一个字符串找出其最长的回文子串#include<bits/stdc++.h>using namespace std;const int maxn = 100010;char str[maxn]; //原字符串 char tmp[maxn<<1];//转换后的字符串 int len[maxn<<1];//转换字符串 int init(char *st){ int i,len = strlen(st); //字符串开头增加一个特殊原创 2021-05-27 21:35:25 · 58 阅读 · 0 评论 -
AC自动机
给你n个zifuchuang#include <queue>#include <cstdlib>#include <cmath>#include <cstdio>#include <string>#include <cstring>#include <iostream>#include <algorithm>using namespace std;typedef long long ll.原创 2021-05-27 21:32:06 · 49 阅读 · 0 评论 -
leetcode56 合并区间(双指针)
首先为了方便合并先将集合按照每个区间的第一个元素进行排序:sort(A.begin(),A.end());AC代码:class Solution {public: vector<vector<int>> merge(vector<vector<int>>& A) { //定义ans储存答案 vector<vector<int>> ans; //...原创 2021-05-15 18:36:59 · 99 阅读 · 0 评论 -
leetcode 搜索插入位置(c++,二分)
直接二分模板好吧,一行水过class Solution {public: int searchInsert(vector<int>& nums, int target) { return lower_bound(nums.begin(),nums.end(),target)-nums.begin(); }};原创 2021-05-15 18:21:57 · 54 阅读 · 0 评论 -
leetcode 50.pow(x,n)(快速幂)
比较简单的数论,直接迭代快速幂即可代码:class Solution {public: //这里的int一定要改成long long int不然会卡数值 double myPow(double x, long long int n) { double ans = 1; unsigned long long y; if(n < 0) y = -n; else y..原创 2021-05-13 21:26:01 · 54 阅读 · 0 评论 -
leetcode 60排列序列
看到题的第一反应当然就是用next_permutation来做,本以为会卡这个函数时间,一次水过了。23333~~~next_permutation这个函数在leetcode也有相关的题目让你写这个函数的实现方法。传送门:leetcode-31下一个排列代码如下:class Solution {public: string getPermutation(int n, int k) { int a[12]; for(int i = 0;i<n...原创 2021-05-13 21:05:46 · 147 阅读 · 0 评论 -
leetcode 螺旋矩阵(模拟)
因为要对矩阵中的所有元素进行遍历,所以时间复杂度为O(n*m)代码:class Solution {public: vector<int> spiralOrder(vector<vector<int>>& M) { vector<int> ans; if(M.size()==0) return ans; int m = M.size()-1; ...原创 2021-05-13 17:58:24 · 92 阅读 · 0 评论 -
lintcode 三数之和(双指针)法
题目链接:三数之和因为要求使a+b+c=0的三元组,因此先将数组s进行排序sort(A.begin(),A.end());又因为不能使结果包含重复的三元组,所以定义一个set判断此三元组是否在之前出现过//用于接收和=0的三元组pair<pair<int,int>,int> x;//储存三元组set<pair<pair<int,int>>> mp;之后定义left,right,让left=i+1,righ...原创 2021-05-12 17:04:51 · 147 阅读 · 0 评论 -
leetcode 盛水最多的容器(双指针法)
看到这道题之后的第一个想法就是暴力,你有你的双指针我有我的两个for当然结果是显而易见的超时了。暴力超时法: int len = height.size()-1; int ans = 0; for(int i = 0;i<=len;i++) { for(int j = i+1;j<=len;j++) { //获取i和j坐标的最小值之后用i与j..原创 2021-05-08 20:06:04 · 93 阅读 · 0 评论 -
leetcode-4.寻找正序数组的中位数
解法:题目要求挑战log(m+n)的时间复杂度,不过不会,写出了比log(m+n)慢一点不过比一般方法快点的复杂度代码大概为O(n)class Solution {public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { //使用insert将两个数组合并在一起 nums1.insert(nums1.end(),n..原创 2021-05-08 17:01:00 · 73 阅读 · 0 评论 -
Leetcode——3无重复字符的最长子串。
给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。示例1:输入: s = "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: s = "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: s = "pwwkew"输出: 3解释: 因为无重复字符的最长子串是"wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"...原创 2021-05-08 16:49:46 · 125 阅读 · 0 评论 -
二叉树的建立与先序输出、求树的深度。
算法步骤:读入字符串如果为'#'则表明此二叉树为空树。否则申请一个空间,将ch的值给bt->data。递归创建左子树,右子树。输入之前应先将二叉树补全即:创建二叉树:void creat_binary(BT &bt){ //先序创建二叉树 char ch; cin >> ch; if (ch == '#') //如果ch==#则bt为空树 bt = NULL; else { bt = new binary_tree; bt-&原创 2021-04-26 21:10:26 · 696 阅读 · 0 评论 -
洛谷P1629 邮递员送信(最短路径)
题目描述:有一个邮递员要送东西,邮局在节点1。他总共要送n−1样东西,其目的地分别是节点2到节点n。由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有m条道路。这个邮递员每次只能带一样东西,并且运送每件物品过后必须返回邮局。求送完这n−1样东西并且最终回到邮局最少需要的时间。输入格式:第一行包括两个整数,nn和mm,表示城市的节点数量和道路数量。第二行到第(m+1)(m+1)行,每行三个整数,u,v,wu,v,w,表示从uu到vv有一条通过时间为...原创 2021-04-26 17:07:32 · 2086 阅读 · 0 评论 -
哈夫曼树创建(C++)笔记
算法步骤①:初始化:首先动态分配申请2n个单元:然后循环2n-1次从1号单元开始,依次将1☞2n-1所有单元中的双亲、左孩子、右孩子的下标都初始化为0;最后再循环n次,输入前n个单元中所有叶子节点的权值。②创建树:循环n-1次,通过n-1次的选择、删除与合并来创建哈夫曼树。选择是从当前森林中选择双亲为0且权值最小的两个树根节点s1和s2的权值和作为一个新节点的权值依次存入到数组的第n+1之后的单元中同时记录这个新结点做孩子的下标为s1,右孩子的结点下标为s2.哈夫曼树的创建://.原创 2021-04-26 16:34:37 · 1966 阅读 · 1 评论 -
单链表的基本操作(C++链表实现)
[问题描述]实现带头结点的单链表的建立、求长度,取元素、修改元素、插入、删除等单链表的基本操作。[基本要求](1)依次从键盘读入数据,建立带头结点的单链表; (2)输出单链表中的数据元素(3)求单链表的长度;(4)根据指定条件能够取元素和修改元素;(5)实现在指定位置插入和删除元素的功能1、初始化链表输入0停止输入:void init(LinkList &L){ LinkList p = new LNode; L = new LNode; L->..原创 2021-04-10 16:41:04 · 3330 阅读 · 0 评论 -
多项式相加(C++)链表实现
[问题描述]设计一个算法,以实现一元稀疏多项式的加法运算。[基本要求](1)输入并建立多项式;(2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,……,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列;(3)多项式a和b相加,建立多项式a+b。实现代码:#include<iostream>using namespace std;typedef struct LNode{ int ci; int .原创 2021-04-10 16:14:00 · 467 阅读 · 0 评论 -
约瑟夫环(C++循环链表)实现
[问题描述]约瑟夫(Joseph)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。令m的初始值为20分析:这道题使用链表做的话可以很容易想到循环链表,接下来构造循环链表并解决问题。1、首先我们应该先创建一个链原创 2021-04-07 20:42:22 · 5122 阅读 · 0 评论