
刷题日记
_吟游诗人
在昨天的未来里活成回忆
展开
-
随机化算法解决圆排列问题 - python解法
问题描述给定n个大小不等的圆 ,现要将这n个圆排进一个矩形框中,且要求各圆与矩形框的底边相切。圆排列问题要求从n个圆的所有排列中找出有最小长度的圆排列。例如,当n=3,且所给的3个圆的半径分别为1,1,2时,这3个圆的最小长度的圆排列如图所示。其最小长度为 。算法设计设计一个随机化算法,对于给定的n个圆,计算n个圆的最佳排列方案,使其长度尽可能小。数据输入由文件input.txt给出输入数据。第一行有1个正整数n (1≤n≤20)。接下来的1行有n个数,表示n个圆的半径。解题思路随机化算法原创 2020-05-23 21:30:47 · 1070 阅读 · 0 评论 -
合并两个有序列表
本来很简单一题,很久没写算法题了居然在细节上纠结了我好久,唉~这种简单题就应该用简单的思路来做…在这也提醒各位,有的题真的只是看起来容易,真的写起来又会有好多乱七八糟的问题了。闲话少说,上题吧,这是leetcode的第21题,各位可以去网站上面刷刷,经过那个测试才知道你的代码会不会有你没发现的问题。分析:首先,题目所给的函数如下,返回是一个指针,如果我在函数内部动态malloc一个链表,...原创 2019-02-22 21:08:40 · 790 阅读 · 0 评论 -
两个单链表判断是否相交
本题看似简单,但其实暗藏玄机,有篇博客对这个问题讲的很详细,且分析了很多种方法,我也不打算再重复造轮子了,我这里就算是对他的一个精简版。他的博客地址:https://blog.csdn.net/dawn_after_dark/article/details/73864643开篇借他的一张图:或许我们看到这个题目的时候,马上就能想到这张图,并且以为很简单,因为只要是相交,最后一个节点一定是相...原创 2019-02-22 21:30:50 · 348 阅读 · 0 评论 -
判断单链表是否有环,如果有环则找到其环的入口
判断单链表是否有环,有一个很简单的算法,即快慢指针算法。我们可以创建两个指针,一个慢指针slow,一个快指针fast,都是从头结点开始往后遍历。其中满指针一次走一步,即slow = slow->next;,而快指针一次走两步,即fast = fast->next->next;,如果链表有环,那么这两个指针必然会相遇,否则fast指针若先指向了NULL,那么显然链表是可以穷尽的...原创 2019-02-23 11:36:09 · 460 阅读 · 0 评论 -
O(1)复杂度求一个栈的最小值
要求一个栈的最小值,第一反应肯定是一个个出栈,那样太蠢了,如何更优呢?第一个思路就是自己定义一个指针,始终指向保存了最小值的那个节点不就行了。看似正确,但是当你最小值的那个节点出栈了,那么如何找到下一个最小值呢?因此,我们需要一个数据结构来保存每一个状态下的最小值。即我们应当知道每当栈中插入一个新元素后的最小值位置,也应当知道每当栈中删除一个元素后的最小值的位置。做法很简单,用另一个栈来记录...原创 2019-02-23 16:44:08 · 342 阅读 · 0 评论 -
KMP算法(超容易理解的next数组求法)
我想,既然知道KMP算法了,自然对于其具体如何运作也是有一定的了解的,我也没必要再大费口舌讲废话,大家一定查过很多资料,但是其实也都看的一知半解,好像自己懂了但是又没有理解透,特别是next数组的求法感觉很蛋疼,那么我就来给大家解决一下这个next数组的问题吧,如果对KMP算法没有概念的同学请先去查清楚再过来看看。先讲一下我们后续讲解的一些规范,我们next数组、以及模式串都是从数组的下标1开始...原创 2019-02-24 12:36:34 · 727 阅读 · 0 评论 -
稀疏矩阵的存储方式
稀疏矩阵就是指一个矩阵中的大部分元素都是0或者是某一个相同的元素,而稀疏矩阵往往有一些有规律的形式,比如上三角、下三角等等,这种有规律的矩阵又称为特殊矩阵。特殊矩阵的储存需要根据特殊矩阵哪点特殊,然后用数学的手段来进行存储,这里就不展开了。我们只讲一般情况下的稀疏矩阵的储存方式。存储方式常见的有两大类,大家也都知道,分别是顺序存储结构和链式存储结构。对于稀疏矩阵,顺序存储结构中常用的方式有...原创 2019-02-24 23:13:11 · 5815 阅读 · 0 评论 -
算法时间复杂度符号分析——O、o、Ω、ω、Θ
O(大O):表示小于等于o(小o):表示小于Ω(大欧米嘎):大于等于ω(小欧米嘎):大于Θ:等于原创 2019-03-01 15:13:03 · 9132 阅读 · 0 评论 -
常见排序算法总结(不详细)
常见的排序算法有如下几种:插入排序直接插入排序折半插入排序希尔排序选择排序简单选择排序堆排序交换排序冒泡排序快速排序二路归并排序基数排序外部排序直接插入排序直接插入排序:新建一个队列(当然也可以不新建,只是麻烦点),将元素依次插入新队列中,保证新队列里的元素是按序插入的。时间复杂度:O(n^2),空间复杂度O(1),稳定折半插入排序折半插...原创 2019-03-03 21:48:08 · 250 阅读 · 0 评论 -
数据结构及算法知识点与题目整理(答案慢更)
本篇博文将对数据结构及算法的常见的题目进行总结,适合作为工作面试、考研机试与复试、自我检验、期末考试等的一份参考资料,囊括的知识点可能不会很全面,题目和答案都会在日后慢慢更新。栈和队列两个栈模仿一个队列– 思路:栈1为入队,栈顶表示队尾;栈2为出队,栈顶表示队首。入队直接入栈1;出队时,如果栈2不为空,则直接弹出栈首,如果栈2里面没有元素,则将栈1的元素依次弹出并压入栈2。入队时若栈...原创 2019-02-22 12:02:16 · 346 阅读 · 0 评论 -
C/C++函数未运行,且显示Process returned -1073741571 (0xC00000FD)
我是在codeblocks中写了一个c++代码,出现的这个问题也是有点莫名其妙,因为没有编译错误也没用运行时错误,就是一个函数不执行了,经过我的调试后发现原因是:在函数内部初始化了一个相当大的数组,导致内存溢出,从而导致整个函数(即便是在初始化这个数组之前的代码)未执行,并导致整个程序直接退出!但是!!!这里的重点不在于定义了一个相当大的数组,而在于内存溢出!不仅仅是这一种情况,只要是出现了这...原创 2019-01-19 13:51:59 · 6740 阅读 · 2 评论 -
51Nod-2006-飞行员配对(二分图最大匹配)
如题,这种题我以前见过,但是作为菜鸟当然做不出来,而今天既然再次遇见,便打算将其搞清楚。遂网上搜索解法,但见满篇代码,却不见有谁讲清楚到底是怎么一回事。大佬们一句裸题就放代码了,可是小白不懂啊~ 于是便有了如下经历,终于花了两个小时A掉了 首先,这是一道数据流的题,但我不会数据流,以后学到了再说。但此题还有另一种解法,其名为匈牙利算法。这让我联想到匈牙利命名法,但其实并没有什么关系。唔,我就是原创 2018-01-10 11:15:01 · 430 阅读 · 0 评论 -
hihoCoder #1015 : KMP算法
题目: 输入 第一行一个整数N,表示测试数据组数。 接下来的N*2行,每两行表示一个测试数据。在每一个测试数据中,第一行为模式串,由不超过10^4个大写字母组成,第二行为原串,由不超过10^6个大写字母组成。 其中N<=20 输出 对于每一个测试数据,按照它们在输入中出现的顺序输出一行Ans,表示模式串在原串中出现的次数。样例输入5HAHAHAHAWQN原创 2017-08-19 21:37:41 · 341 阅读 · 0 评论 -
hihoCoder #1558 : H国的身份证号码I
题目: 描述 H国的身份证号码是一个N位的正整数(首位不能是0)。此外,由于防伪需要,一个N位正整数是合法的身份证号码当且仅当每位数字都小于等于K,并且任意相邻两位数字的乘积也小于等于K。 例如对于K=5, 101、211、210等都是合法的号码,而106、123、421等都是非法的号码。 给定一个正整数N以及K,请从小到大输出所有合法的号码。 输入 两个原创 2017-08-20 16:16:06 · 477 阅读 · 0 评论 -
hihoCoder #1032 : 最长回文子串
这就是最典型的manacher算法题,听起来高大上,而且也很难说清楚,但是实际上并不难,就相当于数学的推理,推出一个公式即可直接解出。题目如下: 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进。 这一天,他们遇到了一连串的字符串,于是原创 2017-08-21 10:07:32 · 301 阅读 · 0 评论 -
51Nod-1003-阶乘后面0的数量
这道题网上已经有很多博客了,但是都没讲清楚,想明白后遂做此记录。阶乘后面0的数量,乘起来是以0结尾,只能是2 x 5,说0结尾的走开。而2的数量肯定比5多不,所以只要计算5的数量即可。但是这个5,不是5,15,25... 这样的明面上的5,而是5作了多少个因子。比如对于5来说,只有一个因子是5,而对于25来说,则有25=5*5,这就是两个5。故而算法代码如下,别人家博客也都是到此为止了,但原创 2018-01-12 10:38:54 · 322 阅读 · 0 评论 -
由c++循环中局部变量地址不变而引发的思考
今天在用c++刷题的时候出现了一个bug,算法题所以免不了循环输入,而所有的代码自然也都嵌套在那个大循环中了。但是问题出现在:我在一个函数(不是main函数)的开头定义了一些局部变量(这个函数在程序中会被循环调用),但是既然是另外一个函数中定义的变量,我想着应该会在函数退出后自动释放了,那也就不需要每次循环都初始化一遍了。 然而事实上,如果不去给它初始化值的话,局部变量每次被声明后所在的地址是相原创 2018-01-05 19:42:36 · 2212 阅读 · 4 评论 -
51Nod-1005 大数加法
如题 这是一道很简单的基础题,当年大一的时候在自己学校的oj上做过这道题的简单版,不过没做出来,现在转眼好几年了,算法一直不好,于是重新来练练手。这道题用java或者python等语言可以用很短的代码写出来,但那没意义了,所以我用的是c++。 思路很简单,无非用字符型数组保存即可。 但是这道题因为有负数,所以负数必须分类讨论。 如果两个都是负数,好办,直接输出一个负号,然后按正数加原创 2018-01-05 19:57:46 · 335 阅读 · 0 评论 -
1001 数组中和等于K的数对——51NOD
这是我在51nod上做的第一道一级算法题,感觉51nod的低级题也没那么难嘛,这就是一道划水题,简单的二分查找就可解了。 我有两种解法,第一种想来效率没二分高,就是排序后分别从头和从后遍历,然后头指针只能向后,尾指针只能向前,这样就避免了一些重复,但是具体会不会TLE就没去尝试了。 第二种解法就是二分查找,我是在二分里揉进了第一种的思想,也避免了一部分重复,当然其实对于二分而言这点小重复也不会原创 2018-01-08 14:26:08 · 377 阅读 · 0 评论 -
51Nod-1002-数塔取数问题
这道题很明显会想到直接dp,但是在此之前我并不知道如果dp会不会超时,因此网上查了一下,居然搜到了大佬千千特别简单的思路戳这里思路是逆序向上,这样的确可以减少很多时间复杂度。 两相对比,从上往下之所以时间复杂度不能降低是因为不能剪枝,必须遍历完整棵树才能知道最大值是多少。而从下往上的话每一层可以少一个数。具体思路没太多好说的,代码不长,看完就懂。#includeusing name原创 2018-01-09 17:17:49 · 410 阅读 · 0 评论 -
hihoCoder #1014 : Trie树
题目: 原题链接:https://hihocoder.com/problemset/problem/1014题解思路: 题目上边已经讲的比较清楚了,建立一棵tril树,同时在创建树的时候,每经过一个节点就给它值加一,也就是说在建立树的时候就顺便记录下了以当前为前缀的单词的个数。代码如下:#include<bits/stdc++.h>#define length 11using namespa原创 2017-08-19 15:01:26 · 351 阅读 · 0 评论