数据结构及算法
文章平均质量分 88
Goallegoal
左手击筑,右手编程。
展开
-
怒刷排列组合,如何解“排列组合”一类的问题
怒刷排列组合在刷Leetcode题目时,时常会看到一些大佬提出时间复杂度为O(1)的题解,而我还在O(nm)和O(n)之间如此反复,细细品味,其实有一类题目是经常可以爆出O(1)的解法的,这一类题目背后的数学依据就是排列组合。顾名思义,排列即排列,组合即组合,排列组合主要是用来解决做一件事情有多少种方法或者某件事发生的概率是多少的问题。例如小明从家到学校可以选择步行、骑车、坐出租车。**问题1:**小明从家到学校有几种出行方式?**问题2:**小明从家到学校再返回家中,有几种出行方式?针对上述的两个问原创 2021-01-13 11:16:26 · 589 阅读 · 0 评论 -
搞定二分查找,套路深得人心
在排序与查找算法中,二分查找是一种常用的用来在有序排列中查找指定元素的方法。二分查找也称折半查找,是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按照关键字有序排列。二分查找的查找思想为:首先将待搜索序列进行排序,既可以按关键字从小到大,也可以从大到小进行排序,将有序序列从中间一分为二,比较中间值与目标值的大小关系,若待搜索序列是按从小到大进行排列的,且此时中间值比目标值小,那么说明目标值一定不在有序序列的左边,接下来重复上述步骤对右边的序列进行进一步二分查找,直原创 2021-01-06 09:09:46 · 373 阅读 · 0 评论 -
求两个三位数相乘得到的最大回文数
求两个三位数相乘得到的最大回文数所谓的回文数是指:一个像14641这样“对称”的数,即:将这个数的数字按相反的顺序重新排列后,所得到的数和原来的数一样。这里,“回文”是指像“妈妈爱我,我爱妈妈”这样的,正读反读都相同的单词或句子。例如由两个两位数相乘得到的最大回文数为9009,9009 = 91 * 99。这里要求的是两个三位数相乘得到的最大回文数。下面内容的侧重点是如何提高寻找这样一个回文数的效率,而不再阐述具体每一段代码所表示的含义。按照正常的枚举法思路,程序要实现的功能为,从100到99原创 2020-12-28 20:22:47 · 2138 阅读 · 2 评论 -
并查集的实现与优化
并查集的实现与优化LeetCode上有一道名为朋友圈的题目,如下:班上有 N 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈,是指所有朋友的集合。给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果M[i][j] = 1,表示已知第 i 个和 j 个学生互为朋友关系,否则为不知道。你必须输出所有学生中的已知的朋友圈总数。读完题目要求,暂时能想到的是,如果要解决该问原创 2020-12-26 10:16:15 · 356 阅读 · 0 评论 -
矩阵乘法
矩阵乘法题目要求:给定一个 m 行、n 列的矩阵 A 和一个 n 行、m 列的矩阵 B。需要用矩阵 A 与矩阵 B 相乘,并且将 m 行 m 列的乘积结果输出。输入格式:测评机会反复运行你写的程序。每次程序运行时,首先在第一行输入2 个整数,分别对应题目描述中的 m 和 n(1≤m, n≤10),两个整数之间用一个空格分隔。接下来 m 行,每行包含 n 个整数,每两个整数之间用一个空格分隔。对应 m 行 n 列的矩阵A。再接下来 n 行,每行包含 m 个整数,每两个整数之间用一个空格分隔。对应原创 2020-12-06 15:54:11 · 509 阅读 · 0 评论 -
更大行列式
更大行列式问题描述:给定一个 3 行、3 列的矩阵 A 和一个 2 行、2 列的矩阵 B。计算矩阵 A 和矩阵 B 的行列式并输出其中较大的一个数。输入格式:测评机会反复运行你的程序。每次程序运行时,输入为前三行,每行包括 3 个空格分隔开的符合描述的正整数,组成了 3×3 的矩阵 A。之后两行,每行包括 2 个空格分隔开的符合描述的正整数,组成了 2×2 的矩阵 B。(输入矩阵中的所有元素均大于等于 −50 小于等于 50)输出格式:输出两个行列式中较大的一个,共一个整数,占一行。原创 2020-12-05 15:32:47 · 503 阅读 · 0 评论 -
矩阵螺旋输出
矩阵螺旋输出题目描述:给定一个 m 行、n 列的矩阵,请按照顺时针螺旋的顺序输出矩阵中所有的元素(从[0][0]位置开始,具体请参见下图)。输入格式:测评机会反复运行你写的程序。每次程序运行时,首先在第一行输入 2 个整数,分别对应题目描述中的 m 和 n(1 ≤ m, n ≤ 100),之间用一个空格分隔。接下来输入 m 行,每行包含 n 个整数(−10000 ≤ a , b , c ≤ 10000),每两个整数之间用一个空格分隔。输出格式:输出为一行,包括 m × n 个整原创 2020-12-04 17:06:09 · 2782 阅读 · 2 评论 -
广义表与二叉树之间的相互转换
广义表与二叉树之间的相互转换二叉树是树形结构中一种特殊的树,其特点是每个结点最多只有两个孩子结点。二叉树除了可以通过典型的树状图来表示外,还可以使用广义表进行表示,例如:A(B,C)表示根结点A的左孩子结点为B,右孩子结点为C;A(,C)表示根结点A的左子树为空,右孩子结点为C。依此类推,可以将任何一棵二叉树以广义表的形式表示出来。广义表转化为二叉树广义表转化成二叉树可以借助栈来实现,利用栈先进后出的特点,先将根结点压入栈中,如果左孩子结点不为空,则将其作为栈顶结点的左孩子结点,并压入栈中,递归左子树原创 2020-11-17 17:17:05 · 5667 阅读 · 6 评论 -
函数递归
函数递归程序调用自身的编程技巧称为递归。递归做为一种算法,在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的主要思考方式在于:大事化小。递归的两个必要条件:1、存在限制条件,当满足这个限制条件时,递归便不再继续。2、每次递归调用之后,越来越接近这个限制条件。练习1:接收一个无符号整型值,按顺原创 2020-08-06 21:34:13 · 132 阅读 · 0 评论 -
RSA加解密算法数学基础及python实现
密码算法实现与应用步骤一Alice 与 Bob 协商会话密钥。采用公钥密码体系,通过自选密码库实现密钥协商,session key 长度 1024 bits.注:密钥协商所需公钥与私钥,采用两种方式生成:1、密码库实现;使用python实现RSA算法,先简单的对RSA进行说明:在对称密码体制中,密钥分发过程复杂,代价高;密钥量增大造成密钥管理困难;保密通信系统的开放性差;如果收发双方素不相识,或没有可靠的密钥传递渠道,则无法通信;当用对称密码算法实现数字签名时,由于通信双方拥有相同的密钥,使得接原创 2020-07-16 08:24:52 · 2186 阅读 · 1 评论