![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
土土土~
黄梅时节家家雨,青草池塘处处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 · 137 阅读 · 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 · 161 阅读 · 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 · 162 阅读 · 0 评论 -
A*(A星)寻路算法
首先非常感谢唐老师的课程,讲的非常好 添加链接描述 三个变量: G值 = 父节点的G值 + 父节点到当前点的移动代价 (父节点的G是0,如果斜着走就是根号2,直着走就是1) H值 = 当前点到结束点的曼哈顿距离 寻路消耗公式 F:=G+H 还有两个列表 开放列表: 吧当前所有可以走的节点都放进开放列表 关闭列表:每一次走过一个节点之后都把这个节点放到关闭列表里面 具体步骤 a、将开始点记录为当前点P b、将当前点P放入关闭列表 c、搜寻点P所有邻近点,假如某邻近点既没有在开放列表或关闭列表里面原创 2021-03-08 12:08:00 · 724 阅读 · 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 · 106 阅读 · 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 · 60 阅读 · 0 评论 -
剑指offer-28-判断二叉树是否关于镜像对称
如何获得二叉树的镜像? 其实就是把左右子节点swap一下就行了 这题不用求二叉树的镜像,直接遍历一下就行了 刚开始的想法很简单,第一个思路就是判断左序遍历二叉树和右序遍历二叉树的结果是否一样,但是WA了 后来仔细一想确实不对,以下的情况不管怎么遍历结果都是一样的 然后还是没忍住看了一下题解,其实只要判断 左子树的左右节点 和 右子树的右左节点 是否一样就行了, 以下是递归的写法: private bool IsNodeEqual(TreeNode t1,TreeNode t2) {原创 2021-01-06 11:59:35 · 124 阅读 · 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 · 98 阅读 · 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 · 73 阅读 · 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 · 103 阅读 · 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 · 120 阅读 · 0 评论 -
大数相乘(浮点数)实现
1 首先判定字符串输入是否合格(是否含有其他非法字符) 2 去掉字符串多余的0 3 提取小数点位置,吧小数点后面有几位记录下来,最后结果中确定结果含有几位小数点,然后在加上(结果小数点的位数=两个字符串小数点后位数相加) 4 用字符串实现大数相乘(去掉小数点),对结果进行复原(在合理位置加上小数点), 5去掉多余的0 public static void main(String[] srgs) { new Decimal().Resolve(); } public void Resolve(){原创 2020-10-07 12:01:36 · 296 阅读 · 0 评论 -
堆排序(代码思路)
参考资料1,写的挺不错 还有这个 假设你已经学建立最大堆或者最小堆 那么怎么利用最大堆来进行堆排序呢? 1:因为堆顶元素一定是最大值,然后将其输出 2:吧堆顶元素与堆的最后一个元素交换, 删除堆的最后一个元素, 将顶元素进行下移操作,这样又可以保证堆顶元素是最大值 3:重复操作1和2直到结束 #include<iostream> #include<algorithm> #i...原创 2020-02-16 12:10:37 · 104 阅读 · 0 评论 -
计算任意两天的时间差
以前都是想着计算日期1后面的天数 加上 日期二从开始的日期数 在 加上两个日期之间年数的天数 but 这种方法太过于复杂,要讨论很多,以前写了好多次都不能完全正确 后来在网上看到一个不错的方法,就是分别计算两个日期到公元0年0月0日的日期差然后再次做差不就行了吗,多简单 #include<iostream> #include<algorithm> #include<s...原创 2020-02-15 19:54:53 · 498 阅读 · 1 评论 -
蓝桥杯C++省赛B组 等差数列
【问题描述】 数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一 部分的数列,只记得其中 N 个整数。 现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有 几项? 【输入格式】 输入的第一行包含一个整数 N。 第二行包含 N 个整数 A 1 ,A 2 ,··· ,A N 。(注意 A 1 ∼ A N 并不一定是按等差数 列中的顺序给出) 【输出格式】 输出一个整数...原创 2020-02-15 19:32:05 · 261 阅读 · 0 评论 -
第十届蓝桥杯 C/C++ B组 I-后缀表达式
题目连接首先说一下他的代码我觉得是错误的,但是思路对不对我也不知道 说一下我的思路: 1:不存在负号 直接加 2:存在负号的个数 = 负数的个数(起码一个正数存在) 其实就是把这个数组所有的绝对值相加 3:存在负号的个数 < 负数的个数(有正数存在) 其实和第二种情况是一样的,也是所有数的绝对值求和 列如 2- ( -1 + -2 + -3) 多余的负数写在一起相当于加起来 4:存在负号...原创 2020-02-15 18:48:31 · 196 阅读 · 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 · 535 阅读 · 0 评论 -
分考场问题
问题大致如下:有n个学生参加考试,每个考场里的任意俩学生都不能认识,求需要的最少的考场的数量 首先输入学生数量n,输入m;接下来m行,每行两个数据i,j,表示i与j认识 样例输入: 5 8 1 2 1 3 1 4 2 3 2 4 2 5 3 4 4 5 其结果为4 首先如果是假如任何认识的学生在同一考场的话用并查集可以解决,但是这种问题怎么解决刚开始有点懵逼,后来一想直接暴力解决不就行了吗,遍历...原创 2020-02-08 22:13:54 · 346 阅读 · 0 评论 -
归并排序求逆序对
归并排序首先是不停地二分,吧一个长度为n的序列二分的话只需要执行log2(n)次,当一个序列只有一个元素的时候二分结束(一个元素的话这个序列一定是有序的),然后返回到上一步,已知两个有序的序列(假设长度为n1和n2),吧这两个序列合并成一个有序的序列的话复杂度是n1+n2(两个序列从头开始,依次比较吧最小的放在前面)这样的话归并排序的复杂度就是N*log2(N); 那么怎么利用归并排序求逆序对,假...原创 2020-02-03 21:39:55 · 112 阅读 · 1 评论