算法
unomit
我所思,我所想呀
展开
-
【辗转相除法的进阶】欧几里得扩展算法
文章目录前言一、欧几里得算法二、欧几里得算法扩展总结前言本文浅谈欧几里得扩展算法!一、欧几里得算法首先来谈谈欧几里得算法!这个也就是我们平常所称的辗转相除法。(小白专属)这个算法最大应用就是求最大公因子。欧几里得给出一个定理就是:(a,b) = (b,a%b) = ..... =(x,0)这个x就是a b 的最大公因子,至于为什么这里有证明估计大家也不想看(哈哈,其实我自己写完也不太想看的!)大家一定关心怎么使用这个算法,很简单(使用递归),也是很短的一个算法。int gcd(in.原创 2020-12-31 21:28:57 · 261 阅读 · 0 评论 -
快来看看,位运算装X大法,简单又好记。
今天我来介绍几种常见的位运算方法:1.大小写字母转换使用字符和空格字符异或就可以得到大小写的转换。#include <iostream>using namespace std;int main(){ char a = 'a'; char b = a ^ ' '; a = b ^ ' '; cout << b << " " << a;}2.两个数的交换使用下列语句可以完成两个数的交换,而不需要额外的变量。(用python不要说话????原创 2020-12-06 16:59:26 · 363 阅读 · 0 评论 -
硬币找零——动态规划解法
动态规划和备忘录的比较:动态规划解法其实和递归备忘录解法很相似,也有点不太相同。动态规划使用dp数组来记录状态。递归备忘录使用备忘录来记录已经计算过的子问题。动态规划是自底向上,递归是自顶向下的。问题的描述:就是给定一个钱数n,然后给定一个k种硬币然后输入硬币的面值,然后求出最少的硬币来凑出这个钱数例如:11块有三种硬币 1 2 5那么最少数就是 3(两个5和一个1)解决代码:#include <iostream>#include <vector>usi原创 2020-12-04 17:05:16 · 238 阅读 · 0 评论 -
硬币找零——递归备忘录解法
问题很常见吧!就是给定一个钱数n,然后给定一个k种硬币然后输入硬币的面值,然后求出最少的硬币来凑出这个钱数例如:11块有三种硬币 1 2 5那么最少数就是 3(两个5和一个1)#include <iostream>#include <algorithm>#include <vector>#include <cstring>using namespace std;int dp(int n,vector<int> &coin原创 2020-12-04 16:33:20 · 513 阅读 · 2 评论 -
斐波那契数列——递归备忘录解法(简单理解)
1.如果让我们递归解决,我们通常使用这一段代码来解决斐波那契数列问题int fib(int n){ if(n==1 || n==2) return 1; else return fib(n-1) + fib(n-2); }确实简单又好懂,可是这段代码细思极恐,时间复杂度是指数级的O(2n)。这可了不得。那么为什么它的时间复杂度这么高呢?我们画出递归树#mermaid-svg-Prlnr0BlDY1omGDf .label{font-family:'trebuchet ms', verdan原创 2020-12-03 21:00:54 · 1919 阅读 · 2 评论 -
Leetcode-5 动态规划解最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。示例 2:输入: “cbbd”输出: “bb”来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/longest-palindromic-substring解决方法:我这里我使用的是动态规划可能时间复杂度O(n2)有点大,但是我是正在做这个。我们想到一个串是否原创 2020-12-02 21:28:45 · 133 阅读 · 0 评论 -
动态规划--三角形问题
这是动态规划很经典的一个问题就是一个三角形类似这样: 23 4输出顶点的到底部的最大和,限制条件元素只能左下或者右下走例如:上述这个三角形,这个输出就是6解决方法:动态规划定义的dp数组的小只需要和最后一行的元素个数相等即可。例如最后一行输入的数据最后一行是10个元素,我就只需要定义一个dp[10]。首先我们可以用一个二维数组来存储这个三角形那么第一行就是一个元素,第n行就是n个元素然后我们遍历每一行的时候就用dp数组来存储本行的最大值,例如最后一行的元素它们本身,然后倒数第原创 2020-12-02 17:55:30 · 402 阅读 · 0 评论 -
计蒜客NOIP2008——动态规划
上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。游戏规则是这样的:n 个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师再次吹哨子时,传球停止,此时,拿着球没传出去的那个同学就是败者,要给大家表演一个节目。聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了 m 次以后,又回到小蛮手里。两种传球的方法被视作不同的方法,当且仅当这两种方法中,接原创 2020-12-01 21:11:58 · 161 阅读 · 0 评论 -
python 输出一个日期是那一年的第几天,通俗解释
注释写的挺详细的,不懂的问我就好。# 判断是否是闰年def leap_year(year): return year % 4 == 0 and year % 100 != 0 or year % 400 == 0def which_day(year, month, day): days_of_month = [ # 平年 [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], # 闰年原创 2020-11-28 17:06:21 · 331 阅读 · 0 评论 -
多数元素,摩尔投票法,简单理解
/*求多数元素 元素个数大于n/2 , 这里假设数据不为空,并且存在多数元素例子:23122 中的多数元素就是2*/解释:就把这个方法想象成,这个元素,不同的元素都是它的敌人都会和它抵消,那么最后剩下的就是多数元素。因为它的个数大于n/2足以对抗所有的其他元素。/*求多数元素 元素个数大于n/2 , 这里假设数据不为空,并且存在多数元素例子:23122 中的多数元素就是2 */ #include <iostream>using namespace std;int main原创 2020-11-28 16:48:04 · 189 阅读 · 0 评论 -
约瑟夫圆环问题,简单好懂的。
/约瑟夫圆环 有n个人数数 ,从1到3 , 数到3的人死,输出剩下的一个人原先的位置/当然这里的计数器可以换成任意的,例如1到9或者其他的。原理都是相通的。/*约瑟夫圆环 有n个人数数 ,从1到3 , 数到3的人死,输出剩下的一个人原先的位置*/ #include <iostream>using namespace std;int main(){ int n; cin >> n; int a[n] = {0}; //数数器 int num = -1; //原创 2020-11-28 16:30:05 · 308 阅读 · 0 评论 -
每日一题:view outlook(简单练习题)
/*描述:view outlook假设有一些距离相同的楼,求第个楼楼顶能看到最多其他楼顶的风光从第 i 座大楼能看到第 j 座大楼当且仅当连接这两个楼顶的线段不与任何其他高楼对应的线段接触或相交。示例:例如它们的高度是2 3 1 2 3注意这里的输入是5 2 3 1 2 3 别搞错了则输出4 2:意思是从第二座楼上可以看见所有其他的楼*// * 思路:从第i个楼,左边的斜率递减,右边的斜率递增 */这里的思路跟我们平时想的时候差不多,处于某一座楼上我们从低到高来看,转化成斜率就是得分左右两原创 2020-11-23 22:22:21 · 252 阅读 · 0 评论 -
希望的每日一题(字符串分割)
问题描述:就是一个字符串分割问题,尽可能分到最小并且一种字符只能出现在一个子字符串例如:abac —>> aba 和 c输出:3 1 (每个子串的长度)注意:要求尽可能短的分割例如:abacde 不可分割为aba cde 要分割为aba c d e思路:要求一种字符只能在一起那么两个相同字母以及中间夹住的是必然在一起的。例如:abacab这个串中,aba是在一起的,aca是在一起的。那么一种字母最左边的和最右边的以及夹在中的时必然在一个子串的。例如:abacab这个串中,aba原创 2020-11-19 21:47:12 · 171 阅读 · 0 评论 -
gcd算法的易错点
我最近写窗口程序想调一下gcd算法的,好长时间没写。写完连连报错,不觉感觉自己是个废物,但人总有忘的时候嘛!hahint gcd(int a, int b) { if (b == 0) return a; //这个地方没看出来写成了if a==0 return b else return gcd(b,a%b);}其实这个错误和我当时记忆相关,为啥不能是a==0 return b;如果这样的话,b就有可能为0,就会有0做除数了,这是必然错误的。谨记:不忽略任何一个小错。(给自己的)...原创 2020-11-16 14:36:05 · 121 阅读 · 0 评论 -
小白解释动态规划背包问题
1.动态规接背包问题划的核心是:拿走当前物品是否对于当前状态有价值#include <iostream>using namespace std;void beibao(int value[], int size[], int n, int capacity);int a[100][100];//存储我们的表int max(int a, int b);int main() { int capacity = 8; int size[4] = { 3,3,4,5 }; int va原创 2020-10-27 10:36:45 · 114 阅读 · 0 评论 -
简述插入排序
什么是插入排序 插入排序就是像我们打牌的时候一样,开始有一张牌,小的放左边大的放右边。把所有的牌插入进去就完成排序了。举个栗子,有一个数组rrvaluer[0]3r[1]2r[2]1初始的话就是有序区就只有一个元素r[0] 无序区有r[1]和r[2],第一次用r[1]和r[0]比较如果小的话就把它放在右边。就得到如下结果rvaluer[0]2r[1]3r[2]1接着插入r[2]因为r[2] < r[1],原创 2020-10-25 11:06:35 · 120 阅读 · 0 评论 -
通俗解释冒泡排序及其两次优化
什么是冒泡排序 冒泡排序就像他的名字一样,像冒泡一样完成排序。举个栗子,现在有一个数组a如下:aValuea[0]2a[1]3a[2]1我们需要进行两轮冒泡,第一轮先比较a[0]和a[1]谁大谁就在右边(根据具体需求),然后比较a[1]和a[2]。第一轮结束,现在确保了a[2]是所有数组元素中最大的。aValuea[0]2a[1]1a[2]3接着第二轮我们确保倒数第二个元素为最大即可。aValue原创 2020-10-24 11:38:29 · 384 阅读 · 2 评论 -
蓝桥杯字符串问题,小白总结,c++数组初始化,getline用法
1)今天小白第一次蓝桥杯(第十一届),记录一下吧! 一.首先介绍一下c++数组初始化,下面的题目会用到,是一个小细节吧1 1.初始化int a[100] = {0};(因为是我学c语言是这样初始化的,但是有的oj网站会报错,所以建议使用第二种 2.memset();使用实例:memset(a,0,sizeof(a)); //将数组的所有元素初始化为0;二.介绍一下getline()的用法 1.常用方法getline(cin,str,’#‘); 从cin流读取到str字符串,包含头文件&l原创 2020-10-17 20:25:07 · 296 阅读 · 0 评论 -
关于辗转相除法的证明,及进制表示法
一.辗转相除法1.求最大公因子的方法(a,b) = (b,c)称为辗转相除法 Ⅰ.其中a = qb + c; (a,b)为a,b的最大公因子。 Ⅱ.简化了求最大公因子的工作量,因为任意整数和0的公因子为其本身。若余数c=0时,b即为最大公因子。2.辗转相除法的证明: Ⅰ.因为(a,b)整除a,(a,b)整除b,根据整除的性质(即a整除b,a整除c,可以得到a整除mb+mc)可以得到(a,b)整除c,所以有c>=(a,b),所以(b,c)。同理可得c<=(a,b)3.辗转相除法的原创 2020-10-19 12:25:21 · 2301 阅读 · 11 评论 -
小白阐述背包问题的递归解法
记录一下今天刚学的背包问题的递归解法! 1.问题描述:假设你有一个容量为8的背包,现在有4个物品大小和价值分别为size[4] = {3,3,4,5} value[4] = {7,6,7,9}怎么使背走的物品价值最大? 2.思路:没啥思路吧!递归的做法大家应该都能看懂的!过几天我看了动态规划后再做一遍吧! #include <iostream>using namespace std;int max(int a , int b){ return a > b ? a : b原创 2020-10-19 22:44:32 · 977 阅读 · 1 评论