算法
土土土~
黄梅时节家家雨,青草池塘处处WA
展开
-
RSA加密
算法思路:随机选择连个互质的整数p和q假设我们选择 43 和 59计算得到 p 和 q 的积 n,算出 n 的欧拉函数n的欧拉函数是指 [ 1 , n-1 ] 里面与 n 互质的元素的个数假设p和q都是质数,那么n的欧拉函数就是p的欧拉函数和q的欧拉函数的积φ(n) = (p-1)(q-1)得到 n=2537φ(n) = 2436随机选择一个整数e,使得 1< e < φ(n),且e与φ(n) 互质,n和e的值将作为公钥我们选择13,即公钥为(2537,13)转载 2021-05-28 19:33:26 · 158 阅读 · 0 评论 -
贪心法 区间覆盖问题
记得大一的时候做过这个类型,当时在vj提交了40多次还是WA,后来还是看了答案,到今天为止都只是有思路,但是代码经常写不出来力扣的 1326题目就是这类型的这类问题就是把区间按照左边的值从小到大排序,然后遍历区间,找下一个的左值在这个区间内并且右值最大的那个点作为下一个区间,代码如下:class Solution {public: struct Range{ int left; int right; Range(int l,int r){原创 2021-03-19 21:54:55 · 193 阅读 · 0 评论 -
二叉树的莫里斯(Morris)遍历
本文章转载来自:https://blog.csdn.net/danmo_wuhen/article/details/104339630莫里斯其实就是把空间复杂度优化到O(1)的二叉树遍历算法。Morris遍历的算法思想假设当前节点为cur,并且开始时赋值为根节点root。判断cur节点是否为空如果不为空如果cur没有左孩子,cur向右更新,即(cur = cur.right)如果cur有左孩子,则从左子树找到最右侧节点pre如果pre的右孩子为空,则将右孩子指向cur。pre.r原创 2021-03-10 20:44:30 · 194 阅读 · 0 评论 -
A*(A星)寻路算法
首先非常感谢唐老师的课程,讲的非常好添加链接描述三个变量:G值 = 父节点的G值 + 父节点到当前点的移动代价(父节点的G是0,如果斜着走就是根号2,直着走就是1)H值 = 当前点到结束点的曼哈顿距离寻路消耗公式 F:=G+H还有两个列表开放列表: 吧当前所有可以走的节点都放进开放列表关闭列表:每一次走过一个节点之后都把这个节点放到关闭列表里面具体步骤a、将开始点记录为当前点Pb、将当前点P放入关闭列表c、搜寻点P所有邻近点,假如某邻近点既没有在开放列表或关闭列表里面原创 2021-03-08 12:08:00 · 751 阅读 · 1 评论 -
排序算法总结
1冒泡排序:重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。重复地进行直到没有再需要交换的数据,也就是说该数列已经排序完成 ,这样,最小的元素会慢慢的浮到最前面时间复杂度:O(n²)空间复杂度:O(1)代码: void MaoPao(int[] arr) { for(int i = 0; i < arr.Length; i++) { for(int j = 0;原创 2021-03-06 11:31:37 · 131 阅读 · 0 评论 -
剑指 Offer 26. 树的子结构
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)刚开始的思路很简单 遍历A 对于A的每一个节点都当做根节点去和B比较,如果两个节点都为空 true如果两个节点有一个不为空 false如果两个节点都不为空,若val值不相等false 相等就继续递归下去代码如下:class Solution {public: bool flag=false; bool isSubStructure(TreeNode* A, TreeNode* B) {原创 2021-03-01 19:50:42 · 82 阅读 · 0 评论 -
剑指offer-28-判断二叉树是否关于镜像对称
如何获得二叉树的镜像?其实就是把左右子节点swap一下就行了这题不用求二叉树的镜像,直接遍历一下就行了刚开始的想法很简单,第一个思路就是判断左序遍历二叉树和右序遍历二叉树的结果是否一样,但是WA了后来仔细一想确实不对,以下的情况不管怎么遍历结果都是一样的然后还是没忍住看了一下题解,其实只要判断左子树的左右节点 和右子树的右左节点是否一样就行了,以下是递归的写法: private bool IsNodeEqual(TreeNode t1,TreeNode t2) {原创 2021-01-06 11:59:35 · 153 阅读 · 0 评论 -
两个链表的第一个公共节点(剑指offer 52)
输入两个链表的头结点,找出两个链表的第一个公共节点如果暴力解决的话,复杂度 n*m不用说了但是可以从后面开始遍历,因为既然是公共节点,从后开始都是一样的,然后知道找到第一个不一样的节点,他的前一个节点就是我们的答案下面附上代码:struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {}};class Solution {public: ListNode *原创 2020-12-11 20:45:40 · 121 阅读 · 0 评论 -
求链表的倒数第K个节点(剑指offer 22)
该开始的想法是吧链表压进栈中去,然后开始计数,直到取到第k个代码如下:class Solution {public: ListNode* getKthFromEnd(ListNode* head, int k) { if(head== nullptr) return nullptr; stack<ListNode*>sta; ListNode* node=head; while(node!= n原创 2020-12-11 18:11:14 · 92 阅读 · 0 评论 -
删除链表的任意节点(剑指offer 18题)
如果被删除节点是头结点 那么就要进行分类讨论这时候,我们可以在搞一个新的节点,把他当做头结点,这样就不用去进行分类讨论struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {}};class Solution {public: ListNode* deleteNode(ListNode* head, int val) { if(head== n原创 2020-12-11 17:51:48 · 109 阅读 · 0 评论 -
获得数据二进制中1的个数
一般的做法是 用 n&1 然后右移一位 这样便可以获得结果 int hammingWeight(uint32_t n) { int res=0; while(n){ if(n&1) res++; n=n>>1; } return res; }但是今天看到一个解决方案挺快的 用 n&(n-1)用 n&(n-1原创 2020-12-01 19:30:02 · 123 阅读 · 0 评论 -
大数相乘(浮点数)实现
1 首先判定字符串输入是否合格(是否含有其他非法字符)2 去掉字符串多余的03 提取小数点位置,吧小数点后面有几位记录下来,最后结果中确定结果含有几位小数点,然后在加上(结果小数点的位数=两个字符串小数点后位数相加)4 用字符串实现大数相乘(去掉小数点),对结果进行复原(在合理位置加上小数点),5去掉多余的0public static void main(String[] srgs) { new Decimal().Resolve(); } public void Resolve(){原创 2020-10-07 12:01:36 · 322 阅读 · 0 评论 -
堆排序(代码思路)
参考资料1,写的挺不错还有这个假设你已经学建立最大堆或者最小堆那么怎么利用最大堆来进行堆排序呢?1:因为堆顶元素一定是最大值,然后将其输出2:吧堆顶元素与堆的最后一个元素交换,删除堆的最后一个元素,将顶元素进行下移操作,这样又可以保证堆顶元素是最大值3:重复操作1和2直到结束#include<iostream>#include<algorithm>#i...原创 2020-02-16 12:10:37 · 125 阅读 · 0 评论 -
计算任意两天的时间差
以前都是想着计算日期1后面的天数 加上 日期二从开始的日期数 在 加上两个日期之间年数的天数 but 这种方法太过于复杂,要讨论很多,以前写了好多次都不能完全正确后来在网上看到一个不错的方法,就是分别计算两个日期到公元0年0月0日的日期差然后再次做差不就行了吗,多简单#include<iostream>#include<algorithm>#include<s...原创 2020-02-15 19:54:53 · 509 阅读 · 1 评论 -
蓝桥杯C++省赛B组 等差数列
【问题描述】数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中 N 个整数。现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有几项?【输入格式】输入的第一行包含一个整数 N。第二行包含 N 个整数 A 1 ,A 2 ,··· ,A N 。(注意 A 1 ∼ A N 并不一定是按等差数列中的顺序给出)【输出格式】输出一个整数...原创 2020-02-15 19:32:05 · 289 阅读 · 0 评论 -
第十届蓝桥杯 C/C++ B组 I-后缀表达式
题目连接首先说一下他的代码我觉得是错误的,但是思路对不对我也不知道说一下我的思路:1:不存在负号直接加2:存在负号的个数 = 负数的个数(起码一个正数存在)其实就是把这个数组所有的绝对值相加3:存在负号的个数 < 负数的个数(有正数存在)其实和第二种情况是一样的,也是所有数的绝对值求和列如 2- ( -1 + -2 + -3) 多余的负数写在一起相当于加起来4:存在负号...原创 2020-02-15 18:48:31 · 215 阅读 · 0 评论 -
蓝桥例题 交换瓶子
有N个瓶子,编号 1 ~ N,放在架子上。比如有5个瓶子:2 1 3 5 4要求每次拿起2个瓶子,交换它们的位置。经过若干次后,使得瓶子的序号为:1 2 3 4 5对于这么简单的情况,显然,至少需要交换2次就可以复位。如果瓶子更多呢?你可以通过编程来解决。输入格式为两行:第一行: 一个正整数N(N<10000), 表示瓶子的数目第二行:N个正整数,用空格分开,表示瓶子目前...转载 2020-02-15 10:21:16 · 541 阅读 · 0 评论 -
分考场问题
问题大致如下:有n个学生参加考试,每个考场里的任意俩学生都不能认识,求需要的最少的考场的数量首先输入学生数量n,输入m;接下来m行,每行两个数据i,j,表示i与j认识样例输入:581 21 31 42 32 42 53 44 5其结果为4首先如果是假如任何认识的学生在同一考场的话用并查集可以解决,但是这种问题怎么解决刚开始有点懵逼,后来一想直接暴力解决不就行了吗,遍历...原创 2020-02-08 22:13:54 · 371 阅读 · 0 评论 -
归并排序求逆序对
归并排序首先是不停地二分,吧一个长度为n的序列二分的话只需要执行log2(n)次,当一个序列只有一个元素的时候二分结束(一个元素的话这个序列一定是有序的),然后返回到上一步,已知两个有序的序列(假设长度为n1和n2),吧这两个序列合并成一个有序的序列的话复杂度是n1+n2(两个序列从头开始,依次比较吧最小的放在前面)这样的话归并排序的复杂度就是N*log2(N);那么怎么利用归并排序求逆序对,假...原创 2020-02-03 21:39:55 · 133 阅读 · 1 评论