![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
宋丹尼尔
不相信莫名其妙的事情
展开
-
跳房子——动态规划
存在n+1个房间,每个房间依次为房间1 2 3…i,每个房间都存在一个传送门,i房间的传送门可以把人传送到房间pi(1<=pi<=i),现在路人甲从房间1开始出发(当前房间1即第一次访问),每次移动他有两种移动策略:A. 如果访问过当前房间 i 偶数次,那么下一次移动到房间i+1;B. 如果访问过当前房间 i 奇数次,那么移动到房间pi;现在路人甲想知道移动到房间n+1一共需要多少次移动;输入描述:第一行包括一个数字n(30%数据1<=n<=100,100%数据 1<原创 2021-06-04 18:27:36 · 1196 阅读 · 0 评论 -
错排问题(装错信封)
NowCoder每天要给很多人发邮件。有一天他发现发错了邮件,把发给A的邮件发给了B,把发给B的邮件发给了A。于是他就思考,要给n个人发邮件,在每个人仅收到1封邮件的情况下,有多少种情况是所有人都收到了错误的邮件?即没有人收到属于自己的邮件。输入描述:输入包含多组数据,每组数据包含一个正整数n(2≤n≤20)。输出描述:对应每一组数据,输出一个正整数,表示无人收到自己邮件的种数。思路: 用A、B、C……表示写着n位友人名字的信封,a、b、c……表示n份相应的写好的信纸。把错装的总数为记作D(n)。原创 2021-06-02 20:52:37 · 727 阅读 · 0 评论 -
最长上升子串——动态规划
广场上站着一支队伍,她们是来自全国各地的扭秧歌代表队,现在有她们的身高数据,请你帮忙找出身高依次递增的子序列。 例如队伍的身高数据是(1、7、3、5、9、4、8),其中依次递增的子序列有(1、7),(1、3、5、9),(1、3、4、8)等,其中最长的长度为4。思路:定义一个dp[n]数组,dp[i]表示以0-i为下标字符串中的最长子序列长度。定义j的范围为0到i-1,如果原数组的arr[j]的值小于arr[i];则比较dp[i]和dp[j]+1值得大小替代dp[i].代码如下:import java.原创 2021-06-02 20:47:23 · 336 阅读 · 0 评论 -
最长公共子序列——动态规划
我们有两个字符串m和n,如果它们的子串a和b内容相同,则称a和b是m和n的公共子序列。子串中的字符不一定在原字符串中连续。例如字符串“abcfbc”和“abfcab”,其中“abc”同时出现在两个字符串中,因此“abc”是它们的公共子序列。此外,“ab”、“af”等都是它们的字串。现在给你两个任意字符串(不包含空格),请帮忙计算它们的最长公共子序列的长度。输入包含多组数据。每组数据包含两个字符串m和n,它们仅包含字母,并且长度不超过1024。对应每组输入,输出最长公共子序列的长度。思路:建立一个dp原创 2021-06-02 18:35:53 · 183 阅读 · 0 评论 -
自定义实现优先级队列(堆)
基于数组自定义实现一个最大堆,包括入堆,出堆,弹出堆顶元素,打印整个堆功能。public class MyHeap { private int[] elem; private int usedSize=0; // 初始化一个k大小的数组 public MyHeap(int k){ this.elem = new int[k]; } //入堆 public boolean offer(int val){ if(isF原创 2021-06-01 22:21:39 · 83 阅读 · 0 评论 -
红与黑——BFS
有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的(上下左右四个方向)黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。输入描述:输入包含多组数据。每组数据第一行是两个整数 m 和 n(1≤m, n≤20)。紧接着 m 行,每行包括 n 个字符。每个字符表示一块瓷砖的颜色,规则如下:“.”:黑色的瓷砖;“#”:白色的瓷砖;“@”:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。输出描述:对应每组数据,输原创 2021-06-01 19:04:02 · 172 阅读 · 0 评论 -
蘑菇阵——动态规划
现在有两个好友A和B,住在一片长有蘑菇的由n*m个方格组成的草地,A在(1,1),B在(n,m)。现在A想要拜访B,由于她只想去B的家,所以每次她只会走(i,j+1)或(i+1,j)这样的路线,在草地上有k个蘑菇种在格子里(多个蘑菇可能在同一方格),问:A如果每一步随机选择的话(若她在边界上,则只有一种选择),那么她不碰到蘑菇走到B的家的概率是多少?输入描述:第一行N,M,K(1 ≤ N,M ≤ 20, k ≤ 100),N,M为草地大小,接下来K行,每行两个整数x,y,代表(x,y)处有一个蘑菇。输原创 2021-06-01 18:57:10 · 208 阅读 · 0 评论 -
二叉树四种遍历方式总结——非递归
实现二叉树先序,中序,后序以及层序遍历1、先序遍历具体步骤:1、创建一个栈和一个ArrayList。2、先让根节点入栈。3、当栈不为空时,栈顶出栈,并将出栈节点值保存到ArrayList中,然后再依次将出栈节点的右子节点,左子节点入栈。ps:因为前序遍历要左子节点在右子节点前面,所以先入栈右子节点,后入栈左子节点(栈是先进后出)代码展示:public void preorder(TreeNode root,ArrayList<Integer> list){ if(原创 2021-05-26 14:51:39 · 200 阅读 · 4 评论 -
对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。
题目对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。给定字符串A以及它的长度n,请返回最长回文子串的长度。在这里,我自己用了两个方法去完成这个题。分享给大家。1、中心扩散法中心扩散法很好理解,就是遍历字符串中的每一个字符,以这个字符为中心去向两边扩散,然后依次更替最长的回文字符子串的长度。举个列子:但是现在有一个问题,就是如果下一个字符跟现在的字符相同,我们就得向右移动右边的指针,因为不管是奇数还是偶数,相同字符组成的字符串它总是回文的。代码展示:public clas原创 2021-05-22 16:14:02 · 932 阅读 · 1 评论 -
排序算法总结
为了统一起见,我先给出一个主函数,条例比较清晰public static void main(String[] args) { int[] array = {34,2,67,88,54,33,78,22,4,90,86,45,6,12,99}; System.out.println(Arrays.toString(array)); insertSort(array); System.out.println("直接插入排序:"+Arrays.t原创 2021-05-20 21:18:40 · 140 阅读 · 3 评论