算法和数据结构C++实现
用C++实现各种数据结构和算法,包括书本《算法导论》《数据结构-严蔚敏》《算法设计与分析》等的例子,和面试常用算法,经典算法等。
本专栏注重C++语言特征,包括STL的用法。
靖心
降低成功的时间复杂度,提高生活的空间复杂度
专注,努力不会白费的!
展开
-
力扣困难题:接雨水的TwoPoint方法题解
解题思路题目链接: https://leetcode-cn.com/problems/trapping-rain-water/属于困难类别的题目,只要理清思路就不难了。成立条件:两端必然形成一个大木桶木板低的一端的雨水必然可以接上,因为另外一个终端有一条更高的木板算法:从木板低端开始计算,只要中间有比这个木板还低的木板,那么这些高度差之间必然可以接雨水如果出现更高的木板,那么久以...原创 2019-12-21 10:37:54 · 576 阅读 · 1 评论 -
POJ 3461 Oulipo KMP算法题解
本题就是给出很多对字符串,然后问一个字符串在另外一个字符串出现的次数。就是所谓的Strstr函数啦。Leetcode有这道几乎一模一样的题目。使用KMP算法加速,算法高手必会的算法了。另外看见讨论说什么使用KMP还超时,最大可能是没有真正理解next table的含义,写了错误的代码,故此虽然自己运行结果正确,但是却没有真正发挥next table的作用,使得算法退化为暴力法了,所原创 2014-07-13 14:36:32 · 1265 阅读 · 0 评论 -
POJ 2406 Power Strings KMP运用题解
本题是计算一个字符串能完整分成多少一模一样的子字符串。原来是使用KMP的next数组计算出来的原创 2014-07-13 17:10:11 · 900 阅读 · 0 评论 -
Leetcode Symmetric Tree 递归和非递归解法
和same tree题目差不多一样的解法。1 recursively 递归法:2 iteratively 非递归:使用先序遍历,原来树的先序遍历的非递归写法也不简单。原创 2014-02-16 01:11:36 · 15202 阅读 · 1 评论 -
Leetcode Palindrome Partitioning II
因为我研究了很长时间,没看提示的情况下,观察了各种可能的判断,始终没有找到可行的快捷方法,判断时间效率必定为O(n*n),没有找到什么规律可以提高效率。最后上网搜索也没看到有可行方法。整个题目解决,如果是可以O(n*n*n)时间复杂度是稍微简单点的,不然对动态规划法的运用就要求比较高了。下面程序分两个函数,两步解决问题:函数1 先产生一个回文表,记录了所有子串是回文的表。函数2 判断最小分隔步数原创 2014-02-07 08:01:09 · 1790 阅读 · 0 评论 -
Leetcode Recover Binary Search Tree
本题注意不能通过测试是否是合法二叉树来修复,而是要通过检查全局二叉树确定哪两个节点的值调换了。检查全局二叉树就是通过检查哪两个值是不按由小到大的顺序的。可以利用额外空间O(n)空间,也可以使用常量空间。要点就是:利用一个数组如vector保存不合法的节点,最后恢复不合法节点。如下面两个程序:原创 2014-02-12 08:06:14 · 2113 阅读 · 0 评论 -
Geeks 面试题: Longest Bitonic Subsequence
这里的技巧是两边扫描,然后合起来,时间效率也是O(n*n),和求最大递增子段和一样。两边扫描是个经典技巧,一定要记得,掌握。原创 2014-02-02 07:05:34 · 2064 阅读 · 1 评论 -
Craking the Coding Interview 面试题:随机抽出子数列
在给定的一个大数列中,随机抽出一个子数列,要求所有数被抽出的概率都是一样的,如下面的运行结果:int rangeRandNum(int a, int b){ return rand()%(b-a+1) + a;}vector randPickArray(vector &arr, int m){ vector picks(arr.begin(), arr.原创 2014-01-31 09:48:30 · 1833 阅读 · 0 评论 -
Geeks面试题: Maximum Sum Increasing Subsequence
下面程序是我的解决方法,时间效率也是O(n*n) 思路:1 从地往上解决法2 计算当前数值到下一个数值是否是递增,如果是递增,后面所有数值的递增数列加上当前数值3 一直计算到最后,就得到数列中所有数值以自己为结束的最大递增子段和因为有可能以最后一个数值结束的递增子段和不是总体得到的最大递增子段和,例如: 3 11 2 10填表得到: 3 14 2 12,那么最大递增子段和是14,不是12所以需要最后比较数组中所有数值,求最大值,当然也可以如下面第二个程序一边求解一边判断最大值,填表得到的是3 14原创 2014-01-30 06:51:16 · 3037 阅读 · 7 评论 -
Leetcode Populating Next Right Pointers in Each Node II
Populating Next Right Pointers in Each Node II What if the given tree could be any binary tree? Would your previous so如何处理各个细节的问题很重要,决定了能否写出更加简洁的程序来。原创 2014-01-30 07:02:53 · 2823 阅读 · 0 评论 -
Leetcode Best Time to Buy and Sell Stock III
要掌握这种思想:1 两段分段思想2 前往后,后往前都可以处理数列的思想时间复杂度是O(n),不掌握这种思想是很难做出来的。原创 2014-01-27 08:53:23 · 2243 阅读 · 2 评论 -
leetcode Longest Valid Parentheses
Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring.For "(()", the longest valid parentheses substring is "()", which has length = 2.Another example is ")()())", where the原创 2014-01-27 08:46:14 · 2147 阅读 · 0 评论 -
Leetcode Palindrome Partitioning
典型的递归回溯法,当然可以利用动态规划法提高点效率。下面是标准的递归回溯程序:原创 2014-01-26 08:17:19 · 1764 阅读 · 0 评论 -
Leetcode Reverse Nodes in k-Group
这种题目一般有技巧:1 增加dummy前置节点,dummy.next指向头节点,可以让程序简洁点2 注意保存当前节点的next节点3 可以利用好k来计算,注意准确计算需要操作的节点指针原创 2014-01-26 08:13:57 · 2553 阅读 · 0 评论 -
Leetcode Container With Most Water
知道原理就是很简单的程序。两边搜索,短板往里走。因为往里走,代表宽度减小,那么宽度小的时候,只有遇上更高的高度才能组成更加大的container。原创 2014-01-25 09:32:37 · 4601 阅读 · 0 评论 -
Leetcode Sort List 链表归并排序
本题好像使用quicksort是不能AC的,只能使用归并排序了。之前觉得是很困难的题目。训练了这么久算法,功力终于上升了。虽然还没达化境,但是以前觉得什么归并排序,快速排序好像很难,曾经死记过,始终没有记住,一直都觉得很困惑,怎么才能写出这些算法出来。如今,随时都能写出这样算法来了。而且代码基本上都很工整,清晰的,O(∩_∩)O~原来算法是练出来的,不是死记硬背的。我说的化境,是觉得有一天会无论什么难题都可以轻松利用学过的算法,转化成优雅的代码,那时候所有算法都已经融会贯通了,所有题目差不多是一样原创 2014-01-25 09:38:47 · 2262 阅读 · 2 评论 -
Geeks面试题:Floyd Warshall Algorithm 所有顶点之间的最短路径问题
就是严慧敏的数据结构书上的图论介绍的所有顶点之间的最短路径问题。不过书上没有说是使用动态规划法做这道题的,也就说的并不透切。记得当年钻研这本书的时候,觉得本题十分难理解,半天没搞明白,然后后来反复记了本题的程序好几遍,始终没记住,终归没有彻底理解本题的思想精髓,那么是很难写出程序的。利用动态规划法的思想做这道题,难度还不是特别大的。主要想清楚什么是从地往上(buttom-up)的方法,如下述:原创 2014-01-24 08:07:41 · 3579 阅读 · 0 评论 -
Leetcode Interleaving String
这种题目应该立即反应需要动态规划法,会填表,然后翻译为程序。可以用递归法求解,但是会超时,而且好像都不容易写。不过这里是三个字符串,应该如何设计这个表是个大问题。这里用s1和s2作为二维表的两个维的下标,然后徐两个下标相加得到s3的一维下标,进行比较字符。这是本题关键,也是这个表这么难设计,所以本题的难度还是很高的。对没接触过这类题目的人来说,应该是五星级难度的题目了。原创 2014-01-24 08:29:15 · 1732 阅读 · 0 评论 -
Leetcode Clone Graph
这里使用深度优先搜索。这样可以递归实现,如果是宽度优先,就要额外使用queue容器。关键点:1 这里的clone需要深度拷贝,就是要使用new操作了2 防止回路无限循环,就要使用hash表,这里使用unordered_map记录访问过的节点。因为这里的label应该是唯一的才对,所以可以直接使用label作为关键字就可以。看起来挺难的,因为图总给人困难的感觉,其实不难,3到4星级难度吧,很多都是基本操作组合起来。原创 2014-01-23 06:42:49 · 5921 阅读 · 4 评论 -
Leetcode LRU Cache
五星级难度的题目。这里的get和set操作都要求时间复杂度为O(1)。思考了好久才想到要用一个双向链表数据结构来保存优先级列表,代表这里的LRU Cache。这个是本题的关键。如果使用其他方法,例如堆操作,好像最多能使得get或者set其中一个是O(1),一个需要O(lgn),会超时。因为这里需要利用key快速定位value,要频繁修改优先级,即也要利用key快速定位优先级,并能修改优先级。原来要考指针的熟练使用。关键点:1 建立一个新数据结构:双向链表,包含数据key和value2 使用一个原创 2014-01-23 06:29:49 · 2072 阅读 · 0 评论 -
Leetcode Populating Next Right Pointers in Each Node
直接上递归法新知识点:重点注意:利用新构造的数据结构有人会觉得使用递归并不符合常数空间的题意,那么可以改成非递归:原创 2014-01-23 06:06:50 · 1301 阅读 · 0 评论 -
Cracking the coding interview: 查找文中两个单词的距离
解法一:只需要一次性查询的,我们可以利用两个下标,一个记录最后一次遇到第一个单词的下标,另外一个记录遇到另外一个单词的下标,然后每次比较两个单词的距离,记录当前最小的两个单词的距离,最后就得到最小的距离了。时间效率O(n);程序如下:解法二:这是个可以优化重复查找效率 的算法,利用额外空间存储文中所有单词出现的次数,并记录其出现的位置,形成一个数列,如果需要查找两个单词距离的时候,就把两个单词的出现位置数列合并起来,遍历一次这个数列就可以得到两个单词的距离了。那么需要建立一个表,所用时间效率是:O(n原创 2014-01-21 09:28:46 · 1761 阅读 · 0 评论 -
Leetcode Flatten Binary Tree to Linked List
深入理解了指针和树的操作,那么这道题是十分简单的,但是没理解好,那么这道题是非常难的。重要一点:遍历访问的时候,不能改变没有访问过的树节点的结构。也因为这一点,所以这道题不能像普通先序遍历那样写程序。仔细观察思考会发现两点特征:1 修改后的树只有右子树,2 访问过之后的节点是可以修改其结构的那么我们可以使用逆先序遍历 - 因为先访问最右边的右子树,那么这个右子树不会在后面的访问中需要了,就可以改变其树形结构了。想清楚这一点之后,这道题就变得非常简单了。下面两个逆先序遍历的程序都十分简单:原创 2014-01-20 19:18:32 · 1311 阅读 · 0 评论 -
链表的QuickSort快速排序法
使用QuickSort快速排序算法,排序一个链表。下面是quickSort,因为quickSort算法的最坏情况是O(n*n), 所以如果做LeetCode上的Sort List这道题目,会遇上最坏情况超时的,不过这是个很好的算法,故此贴出来。也看了有些博客或什么网站也写有quickSort排序链表的文章,注意看清楚了,很多并不是真正的链表排序,而是排序了链表的值,那样并不是链表操作,不能算链表的quicksort。有几个地方需要注意的:1 分成两个链表的时候,注意把结尾=NULL,重新合并中间原创 2014-01-17 08:54:15 · 4345 阅读 · 3 评论 -
Geeks面试题: Egg Dropping Puzzle
这道题有点拗口,就是要知道基本情况:1 有0楼的时候,就不需要实验了,返回02 有1楼的时候,只需要试验一次就可以了3 有一个蛋的时候,最坏情况就需要把所有楼都试验一次在这三种基本情况假设下去想这个问题就容易多了分两个情况:1 碎蛋:往下走2 没碎蛋:往上走无论往上走和往下走都可以截去下面和上面的楼层不考虑不过注意的就是,碎蛋,那么蛋蛋减小1了,没碎蛋那么蛋蛋不用减小。大笑理解透彻,那么优化动态规划法就可以写出来了:下面是GeeksforGeeks的动态规划法和递归法求解,和我写的原创 2014-01-17 08:56:59 · 2437 阅读 · 0 评论 -
Geeks面试题: Cutting a Rod
要根据上面的公式进行思考,形成抽象思维,和系统思维。这种抽象能力非常难,也非常重要,直接决定了效率,甚至能否做出来的问题。优秀的程序员和普通程序员之间的差距也许就从抽象思维能力中分出来了。不过慢慢对动态规划法和递归回溯法熟悉了,其实就可以撇开什么公式和递归回溯,直接从表入手,填表,把表翻译为程序也是个很不错的做法。原创 2014-01-16 09:04:21 · 2148 阅读 · 0 评论 -
Leetcode Word Ladder
没见过这样的题目的话,也很难搞懂他的要求的,所以要问问题:1 中间的选单词,是否可以乱序? -- 可以的,可以随便在字典里面抽那个单词都可以。2 是否需要计算所抽单词的中间距离? 不需要好难的一道题目,虽然思想就是层序遍历树的思想,但是细节太多,很容易导致出错,而且有人使用同样的思想做的却会超时。原因有几个:1 细节需要优化好 - 我增加层间标志的做法就超时了但是使用两个队列的做法不超时,好奇怪的题目。2 对于原字典dict可以作破坏性操作-就是可以delete其中的元素这样操作,速度提高原创 2014-01-16 08:55:19 · 1488 阅读 · 0 评论 -
Geeks 面试题: Rat in a Maze 回溯法解迷宫
Backtracking 回溯法的三部曲:1 初始化原始数据,开始点2 判断下一步是否合法,如果合法就继续递归搜索答案,如果不合法就返回3 递归直到找到答案,返回真值这里只需要找到一个解就可以,所以只要找到一个解就可以马上返回。Leetcode上很喜欢找出所有解的,那么就需要递归所以可能路径了。原创 2014-01-13 08:09:17 · 3730 阅读 · 3 评论 -
leetcode Best Time to Buy and Sell Stock II
Best Time to Buy and Sell Stock IISay you have an array for which the ith element is the price of a given stock on day i.Design an algorithm to find the maximum profit. You may complete as原创 2014-01-13 08:12:33 · 2157 阅读 · 2 评论 -
Leetcode Best Time to Buy and Sell Stock
Best Time to Buy and Sell StockSay you have an array for which the ith element is the price of a given stock on day i.If you were only permitted to complete at most one transaction (ie, bu原创 2014-01-12 10:36:48 · 1782 阅读 · 0 评论 -
Geeks面试题:Matrix Chain Multiplication
Matrix Chain MultiplicationGiven a sequence of matrices, find the most efficient way to multiply these matrices together. The problem is not actually to perform the multiplications, but mere原创 2014-01-12 10:38:17 · 1725 阅读 · 0 评论 -
Geeks 面试题: Coin Change最大找零方案数
Coin ChangeGiven a value N, if we want to make change for N cents, and we have infinite supply of each of S = { S1, S2, .. , Sm} valued coins, how many ways can we make the change? The order原创 2014-01-11 12:41:31 · 3017 阅读 · 0 评论 -
leetcod Binary Tree Level Order Traversal II
Binary Tree Level Order Traversal II Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root).For原创 2014-01-11 12:39:17 · 2057 阅读 · 0 评论 -
Geeks面试题: Longest Palindromic Subsequence
注意:这里是最大子序列的palindromic,不是最大子串的palindromi(leetCode上有道题是)。最大子序列就是:1 所选取的字符是原数列的字符2 字符可以间隔抽去(主要区别,子串是不能有间隔的)3 字符的顺序不能打乱。原创 2014-01-10 07:44:54 · 2263 阅读 · 0 评论 -
LeetCode Construct Binary Tree from Preorder and Inorder Traversal
Construct Binary Tree from Preorder and Inorder Traversal Given preorder and inorder traversal of a tree, construct the binary tree.Note:You may assume that duplicates do not exist in原创 2014-01-10 07:42:52 · 1166 阅读 · 0 评论 -
Geeks面试题:0-1 Knapsack Problem
递归程序虽然慢,但是理解好递归程序是非常有助于理解好本题的。动态规划法和递归法程序:原创 2014-01-09 07:22:38 · 2256 阅读 · 0 评论 -
Leetcode Binary Tree Zigzag Level Order Traversal
我使用了两个deque容器做,其实可以使用stack。我觉得我的代码还是非常清晰的,一块一块的分好,思路很容易跟的。原创 2014-01-09 07:09:46 · 1158 阅读 · 0 评论 -
Leetcode Symmetric Tree
利用递归法,可以很轻松解决的问题。增加一个adaptor接口函数就可以了,搞清楚对称的判断方法:每一个左子树与右子树的节点相等,然后是左子树的右子树和右子树的左子树相等, 有点拗口,不过画图就很好理解了。原创 2014-01-07 10:19:42 · 1164 阅读 · 0 评论 -
Leetcode Search a 2D Matrix 搜索二维表
这道题的解法倒是很多的,网上也有不少分析的。比如LeetCode论坛上有分析非常仔细的,不过他好像推荐的是个O(n+m)的时间效率,这次也是个例外了,他的分析和例子都不好。因为这道题的最优时间效率应该是O(lgm +lgn); m,n 代表行和列数,而且也没有那么复杂,不过就是考二分法的运用,能够灵活运用了做这道题不是难事,本人一次性通过。这里是使用二分法,先列二分,然后行二分,看似复杂,其实是很简单的程序。不用看Leetcode上的那么长编大论的分析。下面是我的程序,看起来长,其实结构很清晰,很好原创 2014-01-02 08:48:20 · 1579 阅读 · 0 评论 -
Geeks面试题: Edit Distance
Problem: Given two strings of size m, n and set of operations replace (R), insert (I) and delete (D) all at equal cost. Find minimum number of edits (operations) required to convert one string into an两个一维表的C++实现原创 2014-01-02 08:45:54 · 1417 阅读 · 0 评论