自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(25)
  • 收藏
  • 关注

原创 FAS问题

题目:来自《算法概论》8.22解:(a)判断一个问题是不是NP问题,要看所给出的实例能不能在多项式时间内验证出来。         在这道题中,我们需要验证一个解E'是不是FAS的解。判断条件如下:        (1)|E'|        (2)G-E'是一个无环图第二个条件可以通过对于每个未访问过的点做DFS。点的状态分为三种:未访问、正在访问和已访问完该点所能到达的

2017-07-06 17:35:20 566

原创 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 243

原创 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 351

原创 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 278

原创 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 262

原创 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 317

原创 Unique Paths

题目描述:一个机器人位于一个M x N网格的左上角。机器人只能在任何时间点向下或向右移动。机器人试图到达网格的右下角。有多少可能的独特路径?解题思路:动态规划的核心是将问题分为规模更小的子问题,所以我们可以考虑从(0,0)到(i,j)所有可能的独特路径。因为只能向下和向右移动,所以我们只需要考虑最后一步是向下还是向右,相加则可得到从(0,0)到(i,j)所有可能的独特路径。 状态转

2017-05-21 21:16:09 195

原创 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 229

原创 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 291

原创 DP——Maximum Subarray

问题描述:在数组中找到连续的子列(包含至少一个数字),使其和最大。解题思路:声明一个sum数组,用来记录当前连续子列的最大和。key:如果当前元素加上sum[i-1],比本身的数值要小的话,则选取当前元素的数值作为sum[i]源代码:class Solution {public:    int maxSubArray(vector& nums) {       

2017-04-30 21:55:08 236

原创 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 413

原创 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 295

原创 DFS——Target Sum

问题描述:给出一个非负整数的列表,a1,a2,...,an和目标,现在有2个符号+和 - 。 对于每个整数,你应该从+和 - 中选择一个作为其新符号。找出有多少种方式来分配符号来使整数等于目标值S.解题思路:对于列表中的每个元素,都有两种选择,通过递归,穷尽2的n次方种可能。如果最后sum为0,则将result++,否则继续尝试其他可能。源代码:class Solution

2017-04-23 18:48:27 245

原创 EASY——Two Sum

问题描述:给定一个整数数组,返回两个数字的索引,使它们相加到一个特定的目标。你可以假设每个输入都只有一个解决方案,而你不会使用相同的元素两次。解题思路:为了避免重复考虑,每次只考虑当前元素和在该元素后面的元素的配对。源代码:class Solution {public:    vector twoSum(vector& nums, int target) { 

2017-04-16 11:34:29 218

原创 Linked List——Odd Even Linked List

问题描述:给定一个单链表,将所有奇数节点组合在一起,然后是偶数节点。 请注意,我们正在谈论节点号而不是节点中的值。解题思路:题目要求将节点分奇数和偶数组合,而奇数和偶数正好是交替的,所以可以考虑声明两个指针p1和p2,分别指向链表的第一、二个节点。遍历这个链表,每次都将p1->next更新为p2->next,这样就使得p1指向了原本的next的next,然后更新p1为p2,p2继续

2017-04-09 20:43:48 409

原创 Tree—Unique Binary Search Trees

问题描述:给定n,存储值1 ... n的结构唯一BST(二进制搜索树)有多少?解题思路:对于从1到n,根有n种选择方式,并将原序列分为两个新的序列,这两个新的序列必然是有序的,规模变小了,而且我们注意到1234和5678所能构造的BST的个数是相同的,所以可以通过递归来实现。因为是尾递归,所以可以改写为迭代,用一个数组来存储从1到n不同长度的序列所能构造的BST的数目。源代码如

2017-04-02 19:47:35 211

原创 BST

问题描述:给定二叉树,确定它是否是有效的二叉搜索树(BST)。解题思路:题目不难,只要进行一遍中序遍历在判断是否严格递增即可。易出错的地方:只判断根的值和左右子树的根的值的大小关系是不够的,要保证左子树的所有节点都小于根的值,右子树的所有节点都大于根的值。源代码:class Solution {public:    void inor

2017-03-26 16:42:56 386

原创 分而治之——Kth Largest Element in an Array

问题描述:找到未排序数组中的第k个最大元素。注意,它是排序顺序中的第k个最大元素,而不是第k个不同元素。解题思路:可以直接调用sort函数来给数组排序,从而得到第k个最大元素。然而实际上,我们并不需要对整个数组进行排序。过程如下:我们可以任取数组中的一个元素,并以它为主元将原来的数组划分为3个部分,第一个部分是大于主元的,第二个部分是等于主元的,第三个部分是小于主元的。当然,这三个部分

2017-03-15 23:07:25 301

原创 Tree——Construct Binary Tree from Inorder and Postorder Traversal

问题描述:给定树的中序和后序遍历,构建二叉树。解题思路:可以先举一个具体的例子,比如:inorder:74258136       postorder:74852631根据后序遍历的特性,postorder中的最后一个数字肯定是整棵树的根。然后在中序遍历中找到根所在的位置,左边就是根的左子树的中序遍历,右边就是根的右子树的中序遍历。根据根的左右子树的中序遍历

2017-03-12 14:29:37 272

原创 Tree——Find Largest Value in Each Tree Row

问题描述:你需要在二叉树的每一行中找到最大值,并将所有的最大值放在vector中作为返回值。解题思路:从根节点开始,依次将每一层的节点从左到右放入vector,current指向当前访问的节点,last指向当前层的最后一个节点。然后把每一层的所有节点值放入一个vector,访问当前层结束后,找出最大的元素放入result中。源代码如下:class Solution {pub

2017-03-12 10:49:10 342

原创 Binary Tree Inorder Traversal

问题描述:给定一棵二叉树,返回它的中序遍历。解题思路:中序遍历的法则:遍历左子树访问当前元素遍历右子树根据中序遍历的法则,可以得到相应的算法:声明一个栈用来存储还没遍历到的节点,而且从栈顶到栈底是向根部回推的一个过程声明一个遍历指针ptr并赋值为root对于每个节点       if有左子树

2017-03-04 21:09:50 365

原创 分而治之——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 344

原创 Stack的应用——Binary Tree Preorder Traversal

LeetCode

2017-02-28 20:22:26 327

原创 Stack的应用——Verify Preorder Serialization of a Binary Tree

Verify Preorder Serialization of a Binary Tree

2017-02-26 16:38:12 232

原创 Stack的应用——Decode String

LeetCode的Decode String

2017-02-26 13:02:37 314

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除