算法
让代码跑一会儿
怕什么路途遥远,走一步有走一步的风景,进一步有进一步的欢喜。
展开
-
KMP初步理解
思路: 对比BF,KMP在匹配过程中,不用每次回退,而这是利用的PMT(部分匹配表)实现的。(关键词:PMT ,尽量少回退) 代码: //1.求PMT(由于我最开始学习的资料是用prefix的叫法,后来发先PMT更能表明。代码中也是使用之前的做法) public int[] prefix_table() { int [] prefix =new int[length]; int len =0; int i =1; whi原创 2020-09-09 16:26:23 · 110 阅读 · 0 评论 -
约瑟夫问题
约瑟夫问题 N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。 解决 (1)链表:用一个循环链表解决。(缺点:时间复杂度为:O(MN)) (2)数学公式 f(n,m)=(f(n-1,m)+m)%m 每杀掉一个人,下一个人成为头,相当于把数组向前移动M位。 若已知N-1个人时,胜利者的下标位置位f(N−1,M)f(N−1,M),则N个人的时候,就是往后移动M为,(因为有可能数组越界,超过的部分会被接到头上,所以还要模N),既f(N,M原创 2020-08-07 20:32:19 · 128 阅读 · 0 评论 -
递归回溯-组合总和
** 题目**: 39.组合总和I 40.组合总和II ** 思路** 从target开始,依次减去数组中的数,直到target<0或target==0,将等于0的结果,放到结果集当中。(也可从0开始相加) 这里的做法,有点树的前序遍历。 题目关键是去重。但两道题给的条件不一样,所以去重上有点区别。 39.重复原因: 解决: 设置搜索起点即可 40.题重复原因: 解决: 设置搜索起点+排序后,剪枝(因为有重复数字)。 因为40题要求,所有数字只能取一次,所以搜索起点比上一层节点+1 **原创 2020-08-04 10:39:34 · 145 阅读 · 0 评论 -
递归回溯-解码方法
** 思路:** *由题可知,解码只有1个字母单独译+2个字母合并译两种方式.1个字母解码的为前一个的解码总数,2个字母解码的为前两个解码总数。 2个字母合并译就三种情况,当前字母为 0,1,2。其余都为1个字母单独译。 当前为‘0’,那么前面一个数字必须为1或2,则解码总数为前一个的解码总数,或者为0 当前为‘1’,有单独译和合并译,两种译法。 当前为‘2’,且前面为‘0’~‘6’。合并译。 ** 代码:** (1)自底向下 int numDecodings(string s) { if (s[0] =原创 2020-08-01 10:38:04 · 145 阅读 · 0 评论 -
求单链表环的入口
leetcode单链表是否有环及入口 参考博客: https://www.jianshu.com/p/ef71e04241e4 https://hui-wang.info/2017/11/18/%E5%8A%A8%E7%94%BB%E8%A7%A3%E9%87%8A%E5%A6%82%E4%BD%95%E6%B1%82%E5%8D%95%E9%93%BE%E8%A1%A8%E7%8E%AF%E5%...原创 2020-03-03 11:51:08 · 116 阅读 · 0 评论