- 博客(25)
- 收藏
- 关注
原创 FAS问题
题目:来自《算法概论》8.22解:(a)判断一个问题是不是NP问题,要看所给出的实例能不能在多项式时间内验证出来。 在这道题中,我们需要验证一个解E'是不是FAS的解。判断条件如下: (1)|E'| (2)G-E'是一个无环图第二个条件可以通过对于每个未访问过的点做DFS。点的状态分为三种:未访问、正在访问和已访问完该点所能到达的
2017-07-06 17:35:20 588
原创 Word Break
问题描述:给定一个非空的字符串,和包含一系列非空单词的词典worddict,确定s是否是一个可以分割成一个或多个字典里的单词的序列。你可以假设字典里不包含重复的单词。解题思路:设布尔数组v[i]表示由s中前i个字符组成的字符串是否可以被分割成一个或多个字典里的单词,最后返回v[s.size()]。状态转移方程如下:v[i]=OR(v[j]&&find(s.substr(j,
2017-06-13 21:05:13 256
原创 Integer Break
问题描述:给定一个正整数n,将其分解为至少两个正整数之和,并使这些整数的乘积最大化。返回你能得到的最大乘积。解题思路:根据给出的这两个提示,我们可以很容易的写出如下的特例情况:7=2+2+38=2+3+39=3+3+310=2+2+3+3通过观察,我们可以大致推测出规律就是当上一个数为3的倍数的时候,当前数是2+2+3+...+3的类型,
2017-06-11 23:48:30 359
原创 Longest Increasing Subsequence
问题描述:给定一个无序的数组,找到最长递增子序列的长度。解题思路:将LIS问题转化为dag上的最长路问题。用dp[j]表示以第j个数结尾的最长递增子数列的长度。转化方式:将每个数作为一个结点. 从结点u到结点v连一条边,当且仅当u代表的数在原数列中出现在v代表的数前面,而且u代表的数比v代表的数小.状态转移方程如下:if(从i到j存在一条边)dp[j]=1+max(
2017-06-04 18:13:47 285
原创 Longest Palindromic Subsequence
问题描述:给定字符串s,找到s中最长回文子序列的长度。你可以假设最长回文子序列的长度为1000。解题思路:声明一个二维数组p[i][j],表示从i到j间的最长回文子序列的长度。Example 1:Input:"bbbab"Output:4One possible longest palindromic subsequence is "bbbb".
2017-06-04 17:02:46 268
原创 Minimum Path Sum
问题描述:给定一个充满非负数的m x n网格,从左上到右下找到一条路径,使路径的所有数的总和最小。解题思路:和上一题类似,也是考虑从(0,0)到(i,j)的最后一步。无非有两种可能,向下或者向右。所以我们可以分别计算出这两种情况的数值总和,并将较小的数值赋给dp[i][j]。状态转移方程:dp[i][j]=min(dp[i-1][j]+grid[i][j],dp[i][j-1]+g
2017-05-21 21:22:52 324
原创 Unique Paths
题目描述:一个机器人位于一个M x N网格的左上角。机器人只能在任何时间点向下或向右移动。机器人试图到达网格的右下角。有多少可能的独特路径?解题思路:动态规划的核心是将问题分为规模更小的子问题,所以我们可以考虑从(0,0)到(i,j)所有可能的独特路径。因为只能向下和向右移动,所以我们只需要考虑最后一步是向下还是向右,相加则可得到从(0,0)到(i,j)所有可能的独特路径。 状态转
2017-05-21 21:16:09 203
原创 DP——Arithmetic Slices
题目描述:给定一个数列,找到所包含的等差数列的数量解题思路:还是以往的思路,声明一个dp数组,dp[i]用来存储到第i+1个元素已包含的等差数列数量。现在考虑dp[i]和dp[i+1]之间的关系,如果新加进来的数可以和前面的数构成等差数列的话,那么dp[i]的数量应该在dp[i-1]的基础上增加,增加的量是多少呢?我们可以举一个简单的例子:12345->123456 如果dp[4]=6
2017-05-07 23:25:46 235
原创 DP——Climbing Stairs
问题描述:你正在爬楼梯的情况。 达到顶部需要n步。每次你可以爬1或2步。 你可以爬多少个不同的方式爬上去?解题思路:声明一个数组step,step[i]用来表示以不同方式走了i+1步的数量源代码:class Solution {public: int climbStairs(int n) { vector steps(n,0);
2017-04-30 22:28:41 301
原创 DP——Maximum Subarray
问题描述:在数组中找到连续的子列(包含至少一个数字),使其和最大。解题思路:声明一个sum数组,用来记录当前连续子列的最大和。key:如果当前元素加上sum[i-1],比本身的数值要小的话,则选取当前元素的数值作为sum[i]源代码:class Solution {public: int maxSubArray(vector& nums) {
2017-04-30 21:55:08 243
原创 DP——Best Time to Buy and Sell Stock
问题描述:假设你有一个数组,第i个元素是第i天给定股票的价格。如果只允许最多完成一个交易(即购买一个交易并且卖出一个股票),则设计一个算法来找到最大利润。解题思路:因为是找差值最大的,借用上一道House Robber的思路,声明一个数组dpmin,用来表示,当前最低的价格。遍历这个数组,当nums[i]-dpmin[i-1]大于当前差值cha时,就更新cha值,同时dpmin[i
2017-04-30 21:19:19 419
原创 DP——House Robber
问题描述:给定一列非负数,找到不相邻的数的最大和。解题思路:声明一个数组dp,dp[i]表示到数组的第i个元素为止不相邻的数能组合成的最大和。比如,给定数列{2,7,1,9},dp[0]=2,到dp[1],因为不能选相邻的数,所以dp[1]=7。然后是dp[2],因为同样的原则,要比较1+dp[0]和dp[1]谁大,将大的数值赋给dp[2]。所以递推公式就是:dp[i] = max(d
2017-04-30 20:01:59 301
原创 DFS——Target Sum
问题描述:给出一个非负整数的列表,a1,a2,...,an和目标,现在有2个符号+和 - 。 对于每个整数,你应该从+和 - 中选择一个作为其新符号。找出有多少种方式来分配符号来使整数等于目标值S.解题思路:对于列表中的每个元素,都有两种选择,通过递归,穷尽2的n次方种可能。如果最后sum为0,则将result++,否则继续尝试其他可能。源代码:class Solution
2017-04-23 18:48:27 256
原创 EASY——Two Sum
问题描述:给定一个整数数组,返回两个数字的索引,使它们相加到一个特定的目标。你可以假设每个输入都只有一个解决方案,而你不会使用相同的元素两次。解题思路:为了避免重复考虑,每次只考虑当前元素和在该元素后面的元素的配对。源代码:class Solution {public: vector twoSum(vector& nums, int target) {
2017-04-16 11:34:29 228
原创 Linked List——Odd Even Linked List
问题描述:给定一个单链表,将所有奇数节点组合在一起,然后是偶数节点。 请注意,我们正在谈论节点号而不是节点中的值。解题思路:题目要求将节点分奇数和偶数组合,而奇数和偶数正好是交替的,所以可以考虑声明两个指针p1和p2,分别指向链表的第一、二个节点。遍历这个链表,每次都将p1->next更新为p2->next,这样就使得p1指向了原本的next的next,然后更新p1为p2,p2继续
2017-04-09 20:43:48 421
原创 Tree—Unique Binary Search Trees
问题描述:给定n,存储值1 ... n的结构唯一BST(二进制搜索树)有多少?解题思路:对于从1到n,根有n种选择方式,并将原序列分为两个新的序列,这两个新的序列必然是有序的,规模变小了,而且我们注意到1234和5678所能构造的BST的个数是相同的,所以可以通过递归来实现。因为是尾递归,所以可以改写为迭代,用一个数组来存储从1到n不同长度的序列所能构造的BST的数目。源代码如
2017-04-02 19:47:35 215
原创 BST
问题描述:给定二叉树,确定它是否是有效的二叉搜索树(BST)。解题思路:题目不难,只要进行一遍中序遍历在判断是否严格递增即可。易出错的地方:只判断根的值和左右子树的根的值的大小关系是不够的,要保证左子树的所有节点都小于根的值,右子树的所有节点都大于根的值。源代码:class Solution {public: void inor
2017-03-26 16:42:56 396
原创 分而治之——Kth Largest Element in an Array
问题描述:找到未排序数组中的第k个最大元素。注意,它是排序顺序中的第k个最大元素,而不是第k个不同元素。解题思路:可以直接调用sort函数来给数组排序,从而得到第k个最大元素。然而实际上,我们并不需要对整个数组进行排序。过程如下:我们可以任取数组中的一个元素,并以它为主元将原来的数组划分为3个部分,第一个部分是大于主元的,第二个部分是等于主元的,第三个部分是小于主元的。当然,这三个部分
2017-03-15 23:07:25 311
原创 Tree——Construct Binary Tree from Inorder and Postorder Traversal
问题描述:给定树的中序和后序遍历,构建二叉树。解题思路:可以先举一个具体的例子,比如:inorder:74258136 postorder:74852631根据后序遍历的特性,postorder中的最后一个数字肯定是整棵树的根。然后在中序遍历中找到根所在的位置,左边就是根的左子树的中序遍历,右边就是根的右子树的中序遍历。根据根的左右子树的中序遍历
2017-03-12 14:29:37 299
原创 Tree——Find Largest Value in Each Tree Row
问题描述:你需要在二叉树的每一行中找到最大值,并将所有的最大值放在vector中作为返回值。解题思路:从根节点开始,依次将每一层的节点从左到右放入vector,current指向当前访问的节点,last指向当前层的最后一个节点。然后把每一层的所有节点值放入一个vector,访问当前层结束后,找出最大的元素放入result中。源代码如下:class Solution {pub
2017-03-12 10:49:10 350
原创 Binary Tree Inorder Traversal
问题描述:给定一棵二叉树,返回它的中序遍历。解题思路:中序遍历的法则:遍历左子树访问当前元素遍历右子树根据中序遍历的法则,可以得到相应的算法:声明一个栈用来存储还没遍历到的节点,而且从栈顶到栈底是向根部回推的一个过程声明一个遍历指针ptr并赋值为root对于每个节点 if有左子树
2017-03-04 21:09:50 374
原创 分而治之——Different Ways to Add Parentheses
问题描述:给定一个含有数字和运算符的字符串,用所有不同的可能的方法计算所有可能的结果。 有效的运算符是+, - 和*。解题思路:Input: "2*3-4*5"(2*(3-(4*5))) = -34((2*3)-(4*5)) = -14((2*(3-4))*5) = -10(2*((3-4)*5)) = -10(((2*3)-4)*5) = 10
2017-03-02 22:16:48 354
原创 Stack的应用——Verify Preorder Serialization of a Binary Tree
Verify Preorder Serialization of a Binary Tree
2017-02-26 16:38:12 238
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人