![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
SSDirector
up up up
展开
-
算法第八章课后练习 8.10
算法第八章课后练习 8.10题目 8.10 利用推广的方法证明NP-完全性。对以下每个问题,请通过证明它是本章某个NP-完全问题的推广,说明它是完全的。 (a) 子图同构:给定两个作为输入的无向图G和H,判断G是否为H的一个子图(即删除H中的某些顶点或边后,所得的新图最多只需再修改某些顶点的名称,即可与G相同),且如果是,返回由V(G)到V(H)的相关映射。原创 2018-01-06 11:15:20 · 358 阅读 · 0 评论 -
Leetcode 102 & 106
Leetcode 102 & 106 分别根据一棵二叉树的inorder和preorder、inorder和postorder构造该二叉树。pre & in算法根据前序的root,在中序中找到该root的位置,该位置左部分为原树的左子树,右部分为原树的右子树。然后在左右两部分中进行相同的操作。只需注意左部分的根,按照给定前序依次遍历就好,右部分的根要在给定的前序中跳过左部分。codestruc原创 2017-12-01 13:10:59 · 309 阅读 · 0 评论 -
leetcode99
Question 99– Recover Binary Search Tree 交换了一个BST二叉查找树的两个元素,要求恢复该BST算法 base:因为二叉查找树的中序遍历结果是升序排列的,所以交换任意两个元素后,交换中的小元素被交换到序列的后面,大元素被交换到序列的前面。算法过程伪代码:/** * Definition for a binary tree node. * stru原创 2017-11-29 20:19:16 · 575 阅读 · 0 评论 -
leetcode
Question 210–Course Schedule II 题设和Course Schedule一样,只不过要求能完成所有课程时返回一个可行的上课顺序;否则,不能完成所有课程时,返回一个空;算法对于[a,b]点对,将b作为边的起始点,a作为边的终点。 用BFS,先将每个点的入度算出来。然后逐渐将入度为0的点去掉,将该点的入度改为-1,并将该点加入要返回的队列中,同时将该点的邻接点的入度减原创 2017-11-14 00:03:17 · 251 阅读 · 0 评论 -
leetcode
Question 329– Longest Increasing Path in a Matrix 给定一个全是int数的矩阵,返回最长递增路径的长度。从一个位置只能向上下左右四个方向移动。 eg: 矩阵: ⎡⎣⎢332422561⎤⎦⎥ \left[ \begin{matrix} 3&4&5\\3&2&6\\ 2&2&1 \end{matrix} \right]原创 2017-11-18 14:12:53 · 185 阅读 · 0 评论 -
leetcode
Question 207–Course Schedule 总共有n个课程,标记为0到n-1。有些课程有约束条件,比如[1,4]代表你在上课程1之前必需先上课程4。现在给你课程总数和一些有约束的课程对的集合,请判断能否上完所有课程。算法 此题将那些约束的课程对看成是图的边,如[1,4]表示从点1到点4的一条有向边,然后判断该图中有没有环。有环则代表存在一些课程相互冲突,不能上完所有课程;否则原创 2017-11-13 09:13:20 · 189 阅读 · 0 评论 -
leetcode
Question 47–Permutations II 给定一个含有重复元素的整数集合,给出它的所有排列。code迭代:vector<vector<int>> permute(vector<int>& nums) { //sort(nums.begin(), nums.end()); vector<vector<int>> permutes; vector<int> t原创 2017-10-15 11:21:29 · 212 阅读 · 0 评论 -
leetcode
Question 46– Permutations 给定几个没有重复的整数,求出它们的所有排列。算法前n个元素的全排列等于在前n-1的的每一个排列中加入第n个元素后形成的所有排列。codevector<vector<int>> permute(vector<int>& nums) { vector<vector<int>> permutes; if(nums.size()==0)原创 2017-10-15 09:35:22 · 165 阅读 · 0 评论 -
leetcode
Question41–First Missing Positive 给定一串未排序的整数,找出第一个漏掉的正整数。 eg. [-1,5,0,1,4,3],结果为2算法首先遍历一遍,把每个整数放在自己的位置上,如nums[2]为5,则把nums[2]和nums[4]交换。 遍历第二遍,返回第一个nums[i]!=i+1的i+1.codeint firstMissingPositive(v原创 2017-10-23 23:25:35 · 195 阅读 · 0 评论 -
leetcode
Question 488 – Zuma Game 五种颜色:R(red)、Y(yellow)、W(white)、B(blue)、G(green)。 给定两个颜色字符串,名为board和hand。你每次需用hand中的一种颜色插入board中,使board中形成多于或等于3种相同的颜色连在一起,然后消除掉它们。给定的board颜色数不多于20,且board初始没有3个或更多相同颜色连在一起的原创 2017-11-22 11:01:38 · 241 阅读 · 0 评论 -
leetcode
Question 98 – Validate Binary Search Tree 判断一棵树是不是二分查找树。算法用DFS算法。每次递归时传递一个最大值和一个最小值。对于当前节点左边的树有一个最大值,右边的树有一个最小值。Codeclass Solution {public: bool isValidBST(TreeNode* root) { return isva原创 2017-11-22 12:44:04 · 192 阅读 · 0 评论 -
Leetcode 112 path sum & 113 path sum 2
Leetcode 112 path sum & 113 path sum 2 给定一棵二叉树和一个整数。path sum 要求判断在该二叉树中是否存在一条根节点到叶子结点的路径,路径上的数字和等于给出的整数。path sum 2要求返回所有满足的路径。算法遍历整棵二叉树,在遍历的同时,若向子代走,则将节点值加起来,若回溯,则减掉节点值。对于path sum,在每个叶子结点处进行判断当前和是否原创 2017-12-01 17:19:38 · 300 阅读 · 0 评论 -
leetcode 53 Maximum Subarray
leetcode 53 Maximum Subarray 给定一个数组(至少包含一个整数),找出一个该数组的连续子数组,并且该连续子数组的和最大,返回最大值。算法 同样使用动态规划解题,找出状态n和n-1之间的关系,然后从0到n-1遍历一遍得到结果状态n和n-1的关系在每个状态下记录两个值,一个是当前的最大值largest,一个是当前的连续子数组的和nowsumnowsum(n)=num原创 2017-12-19 13:03:04 · 169 阅读 · 0 评论 -
leetcode 70 Climbing Stairs
leetcode 70 Climbing Stairs 假设爬到楼顶需要走n步,n为正整数。你每次只能爬一步或者两步,请问有多少种爬法。算法 利用动态规划解题,找出状态n和状态n-1之间的关系,即状态转移方程,然后从前往后遍历一遍,求得结果。状态n和n-1的关系 n比n-1总步数多了一步,n的爬法种数可以从n-1的爬法种数得到: 在n-1的所有爬法后再加1步 把n-1的原创 2017-12-18 23:49:50 · 171 阅读 · 0 评论 -
leetcode 712 Minimum ASCII Delete Sum for Two Strings
712 Minimum ASCII Delete Sum for Two Strings 给你两个字符串s1和s2,在它们中分别删除一些字符后,使得s1和s2剩下的字符串相等。求删除的字符串的最小ASCII和。算法首先将题意转换一下:因为s1和s2给定后,它们的总的ASCII和是不变的,求删除掉的字符的最小ASCII和,就是求最后s1和s2剩下的那个相等的字符串的最大ASCII和。也就是我们原创 2017-12-26 14:38:01 · 277 阅读 · 0 评论 -
leetcode 413 Arithmetic Slices
leetcode 413 Arithmetic Slices 给定一列整数,求含有的算数片个数。 算数片定义:至少包含3个整数,每个相邻整数的差值相等。eg: 1,2,3算法 同样的,使用动态规划求解。找到状态n和状态n-1的关系。在这里就是找到n个整数包含的算数片的个数和前n-1个整数包含的算术片的关系。很明显,dp(n) = dp(n-1) +1dp代表前n个整数包含的算数片原创 2017-12-25 13:16:24 · 253 阅读 · 1 评论 -
647 Palindromic Substrings
647 Palindromic Substrings 求一个字符串的回文子串的个数,子串位置不同即算不同的回文子串。 eg: aaa有6个回文子串,a,a,a, aa, aa, aaa.算法1:中心扩散法 计算从每一个中心位置向两边扩散得到的回文串个数,共有n+n-1个中心位置codeclass Solution {public: int countSubstring原创 2017-12-21 11:49:34 · 248 阅读 · 0 评论 -
leetcode
Question 212 – Word Search II 给定一个字符表和一个string集,返回能在字母表中找到的该string集中的string集。一个string能在字符表中找到表示,在字符表中存在一些连续相邻的字符组成该string。算法对每一个string分别去在字符表中查找,若能找到则将该string添加到返回集中。 对于一个特定的string在字符表中查找时:以每一个字符为起原创 2017-11-23 12:47:37 · 182 阅读 · 0 评论 -
leetcode 198 House Robber
leetcode 198 House Robber 有一列非负整数,需要你从中选择一个序列,要求所选择序列中整数在原始序列中不能相邻,且序列的和最大,返回最大值。算法 利用动态规划解题,找出状态转移方程。dp(n)=dp(n-1) + value(n) (islastchoosed=false&&n>=3)原创 2017-12-19 23:49:25 · 166 阅读 · 0 评论 -
leetcode
Quetion 79– Word Search 给定一个字符表和一个字符串,判断能否用相邻的字符连接起来形成该字符串。算法对每个表中的字符进行一遍DFS。在每次DFS的过程中,记录当前访问过的节点,以免重复访问。若能找到则返回true;否则返回false。Codeclass Solution {public: bool exist(vector<vector<char>>& boar原创 2017-11-23 11:04:18 · 193 阅读 · 0 评论 -
leetcode
Question 90–Subsets II 给定一个整数集合,含有重复的元素,请给出所有的子集(不含重复集合)。算法先把原集合排序,然后像上篇博客中的Subsets中的算法一样。Codevector<vector<int>> subsetsWithDup(vector<int>& nums){ sort(nums.begin(),nums.end()); vector<vect原创 2017-10-14 21:26:57 · 202 阅读 · 0 评论 -
leetcode
Question78–Subsets 给定一个整数集,集合中元素各不相同,求出所有子集。算法n个整数的子集N等于下面两部分:前n-1个整数的子集QQ中的每个集合中再加入第n个元素形成的集合eg:{2,3}的子集:{},{2},{3},{2,3} {2,3,4}的子集:1. 第一部分({2,3}的子集): {},{2},{3},{2,3} 2.原创 2017-10-14 20:11:27 · 167 阅读 · 0 评论 -
leetcode
Question21–Merge Two Sorted Lists 给定两个排好序的单链表,将它们归并在一起,并返回新链表的头指针。算法每次将两个链表的头比大小,小的头结点加入新的链表中,并将头小的那个链表的头指针后移。直到一个链表为空,将另一个链表的剩余部分加入新链表。CodeListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {原创 2017-09-29 09:07:40 · 204 阅读 · 0 评论 -
leetcode
Question20–Valid Parentheses 给定一个仅包含’(‘, ‘)’, ‘{‘, ‘}’, ‘[‘, ‘]’字符的字符串,判断该字符串是否合理。括号必须按正确的顺序关闭。算法建一个栈,遍历一遍字符串,依次将字符入栈。若将要入栈的括号字符与栈顶的括号字符匹配,则不入栈并pop一次。最后判断栈是否为空。需要注意的是,压入第一个字符时,必须判断。Codebool isValid(原创 2017-09-29 08:42:33 · 222 阅读 · 0 评论 -
leetcode
Question19–Remove Nth Node From End of List 给定一个单链表(不告诉长度),删除倒数第n(n为有效,不用判断)个节点,然后返回链表头指针。要求最好只遍历一次。算法遍历一遍该链表,依次压入到一个节点指针栈。然后执行pop()操作n-1次,top()取出要删除的那个节点的指针记为current并将其从栈中pop()。然后判断此时栈是否为空,若空则原链表的h原创 2017-09-29 00:19:46 · 147 阅读 · 0 评论 -
leetcode
Question13–Roman to Integer 将1到3999范围内的罗马数字转换为int型数据 method1(stupid)和上篇博客中的question12一样,列出一个二元数组,然后一个一个去找。注意,从低位的大数字开始找,并且要先找IV(XL, CD), 然后找V(L,D)。code:int romanToInt(string s) { int num=0;原创 2017-09-18 16:20:14 · 395 阅读 · 0 评论 -
leetcode
Question5—Longest Palindromic Substring题目描述:找出给定字符串(长度不超过1000)中的最长回文子字符串Solution:1.一开始直接想到的就是把给定字符串中的每个子字符串判断一遍,看是否是回文字符串,并记下长度以比较。 代码如下:class Solution {public: string longestPalindr原创 2017-09-09 10:51:08 · 202 阅读 · 0 评论 -
leetcode
Question12–Integer to Roman题目描述:将一个1到3999的int数据转换为罗马数字表示罗马数字I(1), V(5), X(10), L(50), C(100), D(500), M(1000) 算法将每个位上的数用罗马数字表示出来,存在一个二维数组里面,然后将int数据按位拆开,并将相应的罗马数字串接起来Codestring intToRoman(int num) {原创 2017-09-18 14:20:35 · 327 阅读 · 0 评论 -
leetcode
Question6–ZigZag Conversion题目描述:给出一个string,按照“之”字形写下去,行数也给出,为n。要求将该之字形string按行读出。算法:遍历一遍原始string,用一个int数来标记行数。每当到第0行时,行数就每次加1;每当到最后一行时,行数就每次减1。用一个大小为n的string数组来存储每行的字符串。Codestring convert(string s, int原创 2017-09-18 13:22:57 · 452 阅读 · 0 评论 -
leetcode
Question 11 —Container With Most Water给定n个非负int型数,a1,a2, … ,an, 分别代表平面坐标系上的一个点(i,ai)。找出其中两个点,分别与对应的点(i,0)形成两条x的垂线段,并使这两条线段与x轴形成的容器盛水最多。思路下文中使用字母及其意义:Maxv(最大体积),Se(较短边),D(两边间的距离)首先明确: 两条线与x轴围成的容器,Maxv=S原创 2017-09-16 22:25:34 · 219 阅读 · 0 评论 -
leetcode
Question22–Generate Parentheses 给你n对括号“()”,返回它们的所有有效组合。算法n对括号,即共有2n个括号字符。从第一位到第2n位,每次按照规则对已有字符串一位一位的构造。在构造过程中用一个left和right分别标记该构造串的左括号数和右括号数。第一位必须是 ‘(’ 当left等于right,只能增加 ‘(‘当left大于right,且left等于n时原创 2017-09-29 13:21:45 · 172 阅读 · 0 评论 -
leetcode
Question26–Remove Duplicates from Sorted Array 给定一个排好序的数组,消除重复的数,除了给定的数组不能开额外的数组,空间复杂度必须是常数。算法因为是排好序的,从头遍历一遍,将不同的元素依次存入原数组。Codeint removeDuplicates(vector<int>& nums) { int vsize=nums.size()原创 2017-09-29 20:31:25 · 176 阅读 · 0 评论 -
leetcode
Question27–Remove Element 将一个给定数组中和给定目标数相同的数删掉,要求在原数组上进行操作。算法和上篇博客中讲的26题一样的解法。Codeint removeElement(vector<int>& nums, int val) { int vsize=nums.size(); if(vsize==0) return 0;原创 2017-09-29 20:35:33 · 181 阅读 · 0 评论 -
leetcode
Question 40–Combination Sum 2 给定一组有重复元素的整数集和一个目标元素target,整数集中的每个整数只能使用一次,求出该整数集中所有的和为target的整数组合。codevoid csiterator(int start,vector<int>& basics, vector<int>& candidates, int target, vector<vector原创 2017-10-23 15:40:27 · 170 阅读 · 0 评论 -
leetcode
Question 39–Combination Sum 给定一组没有重复元素的整数和一个目标整数target,在该整数集找出和为target的所有组合,该整数集中的每个整数可以使用任意次数,没有限制。codevoid csiterator(int start,vector<int>& basics, vector<int>& candidates, int target, vector<vec原创 2017-10-23 15:23:27 · 193 阅读 · 0 评论 -
leetcode
Question29–Divide Two Integers 给定两个int型数,一个被除数,一个除数(不为零),在不使用乘法、除法、取余操作的条件下,求出商。若溢出,则返回INT_MAX。算法溢出的情况只有一种,即被除数为INT_MIN,除数为-1.确定符号,两个数同号为正,异号为负,因此可以用异或操作来定符号。当然最容易的就是一直用被除数减去除数,记录次数,直到被除数小于除数。但这样原创 2017-10-04 21:57:36 · 252 阅读 · 0 评论 -
leetcode
Question35– Search Insert Position 给定一个按升序排列的int数组,不含重复元素。同时给定一个target元素,若数组中有target,返回相应的下标;若没有,则返回target应插进数组的正确下标。算法二分法,注意一下最后的临界情况就行。Codeint searchInsert(vector<int>& nums, int target) {原创 2017-10-11 20:18:30 · 215 阅读 · 0 评论 -
leetcode
Question34–Search for a Range 给定一个按升序排列的可以有重复元素的数组,同时给出一个目标元素target,返回target在数组中的开始下标和结束下标。若不在数组中,返回[-1,-1]. eg:[1,2,2,4,5,5,7]和5,则返回[4,5]。算法使用二分法,缩小区间,直到中间位置为target。分别在找到target的那个区间的左、右区间进行二分查找,确原创 2017-10-11 19:55:48 · 140 阅读 · 0 评论 -
leetcode
Question33–Search in Rotated Sorted Array 给你一个按升序排列的“循环数组”(元素各不相同),即最小元素可以在数组的任意位置。eg:[1,2,3,4,5];[4,5,1,2,3]; []; [1]。同时给你一个目标元素target,返回其在数组中的下标。若不在数组中,返回-1。method 1 从头到尾扫一遍,返回相同元素的下标。code:int原创 2017-10-11 19:03:17 · 173 阅读 · 0 评论 -
leetcode
Question31–Next Permutation 对于一个给定的整数序列,输出它的下一个字典顺序的序列。若给出的序列已经最大,则输出最小序列。 eg:5,4,3 –>3,4,5 1,2,3 –>1,3,2 –>2,1,3 –>2,3,1 –>3,1,2 –> 3,2,1method 1记该序列为a,假设该序列共有n位,我们从后往前看,i(从n-1到1) 很容易知原创 2017-10-10 14:19:13 · 170 阅读 · 0 评论