数据结构/算法
denghe1122
不知道你身边有没有这样一种人,明明已经百里挑一,还觉得基数太小;明明已经出类拔萃,还觉得炮灰太少。每天像缺钱一样勤奋,像欠债一样努力。每每遇到这样的人,我都会问一句:为什么?
展开
-
匈牙利算法——最大匹配问题详解
2017年中兴提前批校招,就考了一题匈牙利算法。 匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名。匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。 先了解一些概念性的东西吧。 1.二分图 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子原创 2017-08-27 11:25:48 · 41279 阅读 · 10 评论 -
排序算法(二)、插入排序 —— 直接插入排序 和 希尔排序
很多教科书上都是这么描述的: 插入排序的基本思想在于每次将一个待排序的记录,按照其关键字的大小,插入到前面已经排好序的子序列中,直到全部记录插入完成。1、直接插入排序 用通俗的语言表述一下直接插入排序过程:比如数组 a[5] = {1,2,3,6,4};(1)设置两个循环。外层循环遍历所有的元素。内层元素遍历外层循环遍历到的那个元素(比如说 a[2],也就是 3)的前面所有的元素(也...原创 2018-03-25 12:30:05 · 434 阅读 · 0 评论 -
排序算法(三)、交换排序 —— 冒泡排序 和 快速排序
1、冒泡排序C 程序如下:// 冒泡排序void sort2(int a[], int n){ for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - 1- i ; j++) { if (a[j] > a[j + 1]) { swap(a[j], a[j + 1]); ...原创 2018-03-25 22:22:38 · 399 阅读 · 1 评论 -
排序算法(四)、选择排序 —— 简单选择排序 和 堆排序
1、简单选择排序简单选择排序思想是:从头到尾(从后往前也行)遍历序列,先固定第一个位置的数据,将该位置后面的数据,依次和这个位置的数据进行比较,如果比固定位置的数据大,就交换。这样,进行一趟排序以后,第一个位置就是最小的数了。然后重复进行,第 2 次遍历并且比较后,第二个位置就是第二小的数字了,,依次类推比较简单,直接上代码吧:void selectsort(int a[], int n){ ...原创 2018-03-26 20:55:09 · 524 阅读 · 0 评论 -
排序算法(五)、堆排序 —— 合并果子
2004年NOIP全国联赛普及组 题目描述: 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。 因为还要花大力气把这些果子搬回家,所以多多在合并果...原创 2018-03-26 22:34:21 · 689 阅读 · 0 评论 -
动态规划 —— 回文串(数)
今天是周日,看着身边的人都去踏青了,而我泡在实验室刷了将近 10 题回文数(串)相关的题目,这脑袋,也不知道被啥踢了。。但愿苦心人,天不负吧。。。回文串的相关题目,变化还是不少的。本博客一点点呈现。题目包括:(1)判断回文串(数)(2)统计回文个数(将两个字符串混合)(3)回文数猜想(4)回文链表(三种方法)(5)字符串的最长回文子串(6)回文子序列个数1、什么是回文串(数)回文串是正读和反读都一...原创 2018-04-01 22:40:11 · 3278 阅读 · 1 评论 -
KMP 算法
1、字符串中包含子串描述:给定一个字符串 A,要求在 A 中查找一个子串 B方法一:利用 string 的一些函数,比如 find(),substr() 等。int findstr(string str, string substr){ assert(!str.empty() && !substr.empty()); // 断言,必不可少 int length_str = ...原创 2018-04-09 22:22:11 · 438 阅读 · 0 评论 -
排序算法(六)、归并排序
1、二路归并排序“归并”即“合并”,是指将两个或者两个以上有序表组合成一个有序表。假如待排序表含有 n 个记录,即可以视为 n 个有序的子表。每个子表长度为1,然后两两归并,得到 n/2 个长度为 2 或者 1 的有序表,然后,再两两归并,。。。。如此重复,直到合并成一个长度为 n 的有序表为止。这种排序方法称为“二路归并排序”。递归形式的二路归并算法,主要包含两个步骤:(1)、分解:将长度为 n...原创 2018-03-28 22:27:54 · 1185 阅读 · 0 评论 -
贪心算法(一)背包问题
1、贪心算法、分治法、动态规划之间的区别与联系分治法:将原问题划分成 n 个规模较小的,并且结构与原问题相似的子问题;递归地解决子问题;然后合并其结果。比如快速排序、归并排序等。分治法能解决的问题,一般具有以下特征:(1)问题的规模缩小到一定程度就可以解决;(2)该问题可以分解为若干规模较小的相同问题;(3)子问题的解可以合并为该问题的解;(4)子问题是相互独立的。第(1)个特征绝大多数问题都能满...原创 2018-04-06 22:04:28 · 4500 阅读 · 0 评论 -
动态规划 —— 基础篇
转载于:https://blog.csdn.net/baidu_28312631/article/details/47418773动态规划相信大家都知道,动态规划算法也是新手在刚接触算法设计时很苦恼的问题,有时候觉得难以理解,但是真正理解之后,就会觉得动态规划其实并没有想象中那么难。网上也有很多关于讲解动态规划的文章,大多都是叙述概念,讲解原理,让人觉得晦涩难懂,即使一时间看懂了,发现当自己做题的...转载 2018-05-28 15:50:21 · 545 阅读 · 0 评论 -
动态规划 —— 进阶
转载于:https://blog.csdn.net/baidu_28312631/article/details/47426445在我的上一篇文章中已经详细讲解了动态规划的原理和如何使用动态规划解题。本篇文章,我将继续通过例子来让大家更加熟练地使用动态规划算法。 话不多说,来看如下例题,也是在动态规划里面遇到过的最频繁的一个题,本题依然来自于北大POJ: 最长公共子序列(POJ1458...转载 2018-05-28 15:51:30 · 472 阅读 · 0 评论 -
排序算法(一)
三大查找、八大排序是数据结构中非常重要的知识点,也是笔试面试必考的知识点。本系列对此做一个总结,供自己时常复习使用。也希望能给对此不甚明了的同学一点帮助。 排序算法分为内部排序和外部排序。内部排序是指将所有的元素调到内存中进行排序,其排序效率用比较次数来衡量。而外部排序是指大文件的排序,即待排序的记录存储在外部存储器上,待排序的文件无法一次性装入内存,因而,需要在内存和外部存储器中多次...原创 2018-03-25 10:19:37 · 373 阅读 · 0 评论 -
动态规划——最长公共子序列 与 最长公共子串
1、最长公共子序列LCS 问题,即最长公共子序列问题。它并不要求所求得的字符在所给定的字符串中是连续的。比如输入的两个字符串是 ABCBDAB 和 BDCABA,那么,BCBA 和 BDAB 都是他们最长的公共子序列。则输出它们的长度 4。假设两个字符串 A = [A0,A1....Am],,B = [B0,B1...Bn] 的最长公共子序列是 C = [C0,C1.....Ck]。下面分三种情况...原创 2018-03-29 22:39:15 · 3491 阅读 · 0 评论 -
匈牙利算法——最大匹配问题(具体例程)—— 过山车问题、奶牛选择问题产奶、飞行员匹配
1、(杭电2613)—— 过山车问题Problem DescriptionRPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了。可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐。但是,每个女孩都有各自的想法,举个例子把,Rabbit只愿意和XHD或PQK做partner,Grass只愿意和linl原创 2017-08-27 11:41:27 · 1492 阅读 · 0 评论 -
剑指offer——面试题15:链表中第 k 个结点
在牛客网上,我先用了一个愚蠢的方法测试一下,觉得写得挺简单的啊, case 通过率为 16.67?我不太明白是什么意思了。。。 题目:输入一个链表,输出该链表中倒数第 k 个结点。这一题有两种比较巧的做法,但是一开始我想不出来,所以只能写一个遍历两次结点的程序。 我的代码: /*struct ListNode { int val; struct ListNod原创 2017-10-24 21:38:36 · 633 阅读 · 0 评论 -
剑指offer——面试题37:两个链表的第一个公共结点
题目:输入两个链表,找出它们的第一个公共结点。【方法一、利用栈】代码:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* FindFirstCommo原创 2017-10-25 21:32:11 · 746 阅读 · 0 评论 -
剑指offer——面试题17:合并两个排序的链表(非递归方法和递归方法)
题目:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 分析:一开始拿到这一题,我定义了两个栈,一次把两个链表的结点依次压入栈中,然后依次比较两个栈的栈顶元素,使用尾插法,合成一个新的链表。本来感觉不算太复杂,但是我写出来的代码和《剑指offer》书上一比,,自惭形秽地太厉害了,所以,在这里我还是不粘上了,就让它躺在我的牛客网上的编辑页面吧原创 2017-10-26 22:00:42 · 616 阅读 · 0 评论 -
剑指offer——面试题22:栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)代码:class Solution {public: bool IsPopOrde原创 2017-10-28 16:30:10 · 478 阅读 · 0 评论 -
剑指offer——面试题7:用两个栈实现队列
题目(牛客网):用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型代码:class Solution{public: void push(int node) { stack1.push(node); } int pop() { int temp = 0; if(st原创 2017-10-29 10:39:31 · 491 阅读 · 0 评论 -
剑指offer——面试题21:包含 min 函数的栈
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。代码:class Solution {public: void push(int value) { dataStack.push(value); if(minStack.empty() || minStack.top() > value) // 本题最重要的就是什么时候原创 2017-10-29 11:28:56 · 548 阅读 · 0 评论 -
剑指offer——面试题10:二进制中1的个数
题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。完整代码:class Solution {public: int NumberOf1(int n) { int berNum = 0; while(n) { berNum++; n = (n-1) & n原创 2017-10-29 15:36:30 · 582 阅读 · 0 评论 -
剑指offer——链表-删除链表中重复的结点
题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5程序:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(原创 2017-10-23 21:41:29 · 1057 阅读 · 2 评论 -
剑指offer面试题5——链表之从尾到头打印链表
题目描述:输入一个链表,从尾到头打印每个结点的值。/*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) :* val(x), next(NULL) {* }* };*/ 以上内容是题目给的结点定原创 2017-10-21 19:04:03 · 966 阅读 · 0 评论 -
数据结构——线性表(一)线性表的顺序存储和单链表
今天,好好整理下线性表的内容,打好基础。同时也为刷程序题做准备。本博客对相关代码做了非常详细的注释。 本博客主要参考了程杰先生的《大话数据结构》和严蔚敏老师的《数据结构c语言版》 1、线性表 线性表(List)是指零个或多个数据元素的有限序列。从名字看,是具有像线一样的性质的表。第一,它是一个序列,也就是说,元素之间是有顺序的,这个顺序不是指从小到大或者从原创 2017-10-14 08:58:30 · 4091 阅读 · 2 评论 -
堪称最好最全的A*算法详解(译文)
英文原文链接:http://theory.stanford.edu/~amitp/GameProgramming/ 英文原文参考:http://www-cs-students.stanford.edu/%7Eamitp/gameprog.html#Paths 翻译参考链接:http://blog.csdn.net/b2b160/article/details/4057781翻译 2017-12-12 21:50:38 · 111606 阅读 · 23 评论 -
atoi() 函数与 itoa() 函数:字符串与数值之间的转换
在 C 语言中, atoi() 函数是实现字符串转换成数字,atoi() 函数源码:isspace(int x){ if(x==' '||x=='\t'||x=='\n'||x=='\f'||x=='\b'||x=='\r') return 1; else return 0;}isdigit(int x){ if(x='0') return 1;原创 2017-12-18 22:13:19 · 474 阅读 · 0 评论 -
Hashmap 源码与原理
本文参考了三篇博文:1、https://blog.csdn.net/u010335911/article/details/262978592、https://blog.csdn.net/srzhz/article/details/7881946/3、https://blog.csdn.net/ddkxddkx/article/details/6555754下面给出源码,其他内容参考上述博文吧has...转载 2018-05-30 21:17:33 · 429 阅读 · 0 评论