算法分析与设计
YuMingJing_
这个作者很懒,什么都没留下…
展开
-
快速排序递归实现
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <vector>#include <limits.h>#include <string>#include <map>#include <math.h>#include <list>#include &l.原创 2020-06-10 16:26:38 · 200 阅读 · 0 评论 -
leetcode 572 另一棵树的子树
题目地址:https://leetcode-cn.com/problems/subtree-of-another-tree/DFS暴力求解:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right;...原创 2020-05-07 15:15:41 · 270 阅读 · 0 评论 -
剑指offer 重建二叉树
#include <iostream>#include <stack>#include <vector>using namespace std;struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), lef...原创 2020-02-19 11:33:46 · 168 阅读 · 0 评论 -
剑指offer 从尾到头打印链表
#include <iostream>#include <stack>#include <vector>using namespace std;struct ListNode { int val; struct ListNode *next; ListNode(int x): val(x), next(NULL...原创 2020-02-18 16:16:04 · 107 阅读 · 0 评论 -
剑指offer 替换空格
#include <iostream>#include <string>#include <cstring>using namespace std;class Solution {public: void replaceSpace(char *str,int length) { if (str == nullptr || length &...原创 2020-02-14 16:37:31 · 115 阅读 · 0 评论 -
剑指offer 二维数组中的查找
#include <iostream>#include <vector>using namespace std;class Solution {public: bool Find(int target, vector<vector<int> > array) { if(array.size() == 0){ ...原创 2020-02-13 13:57:12 · 97 阅读 · 0 评论 -
剑指offer 数组中重复的数字
#include <iostream>using namespace std;class Solution {public: bool duplicate(int numbers[], int length, int* duplication) { int table[250] = {0}; for (int i = 0; i < ...原创 2020-02-13 13:15:57 · 133 阅读 · 0 评论 -
《算法概论》第八章 部分习题解答
8.8EXACT 4SAT是一个NP问题,通过将3SAT归约到EXACT 4SAT来证明EXACT 4SAT的NP完全性。对于任意的一个3SAT,如果其中的某个子句包含了同一个文字多次,那么可以缩减为一次。如果他同时包含了某个变量的否定和肯定,如(x和x ̅)那么就可以把x去掉。我们就可以在每个子句中添加一些辅助变量,这样就是把每个字据所包含的文字数目扩充到四个。所以把一个3SAT实例转化成了一个E原创 2017-12-30 10:10:12 · 575 阅读 · 0 评论 -
Leetcode 650. 2 Keys Keyboard[medium]
原題地址題目内容題目分析題目的意思為,初始狀態衹給你一個字符A,最後要你輸出有n個A。 能進行的衹有兩種操作:1,複製當前整個字符串。2,粘貼上一步複製的字符串。 假設要輸出4個A,那麽采取的最少的操作是: 1.複製當前1個A 2.粘貼A 3.複製當前的2個A 4.粘貼2個A 最少4部輸出4個A 所以假設n%2==0 那麽f(n)=f(n/2)+2; 如果n%3==0 那麽f(n)原创 2018-01-11 21:47:16 · 261 阅读 · 0 评论 -
Leetcode 357. Count Numbers with Unique Digits[medium]
原題地址題目内容題目分析題目的意思為給定一個常數n,n代表自然數的位數最多可以為n位,每一個自然數都不可以有重複的數字出現,比如111,2222,3344等,求出最多可以有多少個數字。 我們知道1位數時,可以有f(1)=10個數字0,1,2…9 2位數不相同的有f(2)=9*9個數字 3位數不相同的有f(3)=9*9*8個數字 ……. 10位數f(10)=9*9*8*7*…*1; 11位原创 2018-01-11 21:28:58 · 174 阅读 · 0 评论 -
Leetcode 343. Integer Break[Medium]
原題地址題目内容題目分析題目的意思為,給定一個常數n,求出一個數字集合{Xi},使得X0+X1+…+Xi = n;并且使得X0*X1*….*Xi的結果最大 采用dp算法。令dp[n]為最大的product。 那麽遞推方程為: dp[n]=max(i*dp[n-i],i*(n-i)) 其中dp[1] = dp[2] = 1;代碼實現class Solution {public: in原创 2018-01-11 21:02:20 · 191 阅读 · 0 评论 -
LeetCode 646. Maximum Length of Pair Chain [Medium]
原题地址题目内容题目分析题目的意思为找出能相连的最长串的长度,(a,b),(c,d),因为b < c,所以他们是能相连的。 采用动态规划的方法,首先对原来的pair数组进行排序。用dp[n]记录每个pair能形成链的最大长度。设一个变量temp,如果pairs[j][1]代码实现class Solution {public: int findLongestChain(vector<vec原创 2017-12-14 21:33:42 · 291 阅读 · 0 评论 -
Leetcode 547. Friend Circles [Medium]
原题地址题目内容题目分析题目的意思是,找出有多少个朋友环.如果A认识B,B认识C,那么A B C可构成一个环,D E互相认识,他们构成另一个环。采用dfs的方法,将能联通的记录成一个环,并且把访问过的节点标记为true,没有访问过的继续做dfs看是否还有朋友环。代码实现class Solution {public: int findCircleNum(vector<vector<int>>原创 2017-11-26 22:38:51 · 355 阅读 · 0 评论 -
LeetCode 413. Arithmetic Slices [Medium]
原题地址题目内容题目分析A[i]-A[i+1] = A[i+1]-A[i+2],这样的式子成为arithmetic,也就是等差数列,题目的意思为,给你一个数组,问最多能分为多少个等差数列,每个数列至少含有3个数字。 一开始想用动态规划的方法,但后面发现暴力求解也挺简单的,就过了。对于每一个A[i]都求出从i开头能分割多少组等差数列出来,然后tot++,一旦不行就从i+1开始继续分,最后返回tot即原创 2017-12-05 14:23:49 · 180 阅读 · 0 评论 -
LeetCode Find Bottom Left Tree Value [Medium]
原题地址题目内容题目分析题目的意思为:找到整棵树最后一行最左边的那个数。采用先序遍历的方法,用maxdepth来记录当前最深的的层数,res来记录当前最左的数值。depth来记录当前遍历所在的层数。这里要注意一点的就是判断条件是depth>maxdepth而不是depth>=maxdepth。因为先序遍历是先遍历左子树,所以res肯定是记录leftmost,而如果depth>=maxdepth的话,原创 2017-09-24 17:09:00 · 283 阅读 · 0 评论 -
LeetCode 515. Find Largest Value in Each Tree Row [Medium]
原题地址题目内容题目分析题目要求的是整棵树每一层最大的数。最开始想到的就是层序遍历,从上到下,从左到右遍历,把每一层最大的数存起来。后面参考了leetcode上面的discuss。发现还有另外一种做法,就是采用先序遍历,并且用depth来记录当前访问到第几层,由于每层只会有一个最大值,所以如果depth+1>result.size(),那么说明访问到了新的一层(因为depth是从0开始计数的),将当原创 2017-09-25 13:01:48 · 261 阅读 · 0 评论 -
LeetCode 240. Search a 2D Matrix II
原题地址题目内容题目分析 这个矩阵从左到右逐渐增大,从上到下也是逐渐增大的。先从最右列第一个数开始比较,如果target大于它,说明target在这一列,否则往左查找,比较左边一列第一个数,以此类推。 确定列数后开始向下寻找行数即可,如果找不到则返回结果fasle。代码实现class Solution {public: bool searchMatrix(vector<vector<i原创 2017-09-09 15:55:31 · 306 阅读 · 0 评论 -
LeetCode 23. Merge k Sorted Lists [hard]
原题地址题目内容Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 将k个已排好序的链表归并为一个序列。题目分析首先想到的是实现归并两个排好序的序列,这里采用最简单的方法,将两个序列的数从头到尾开始一一比较放进一个新的序列。然后实现归并K个序列,这里采原创 2017-09-09 17:53:20 · 206 阅读 · 0 评论 -
LeetCode 312. Burst Balloons[hard]
原题地址题目内容题目分析首先理解题目的意思:假设有一圈气球,每个气球上都有一个数字,假设扎破第i个气球,就会得到一个值res = ball[left]xball[i]xball[right],此时,left和right变成相邻的了,因为i气球被扎破。每扎破一个气球就进行一次计算,并且把值叠加到res上,使得所有气球都被扎破,最后得到的res的值最大。设立一个动态数组dp[left][right]表示原创 2017-10-25 19:54:44 · 363 阅读 · 0 评论 -
LeetCode 399. Evaluate Division[Medium]
原题地址题目内容题目分析采取类似于邻接表的方法,用一个map(string,double)来存储两个字符之间相除的值,用vector来存取所有的字符,在第一读取的时候存储方式如下,map[“a/a”] = 1.0,map[“b/b”] = 1.0,map[“a/b”] = 2.0,map[“b/c”] = 3.0,此时把a,b,c三个字符也同时存入vector里面。 接着开始找每个字符所能遍历到的原创 2017-10-17 14:41:11 · 326 阅读 · 0 评论 -
LeetCode 684. Redundant Connection [Medium]
原题地址题目内容题目分析题目的意思大致为,给了一个无向图,让我们删掉组成环的最后一条边。一开始想的做法是想采用拓扑排序来判断是否由环,如果有再删去多余的边。后面看了leetcode的discuss,发现他用了一个较为简单的方法,union find。建立一个长数组,来存储每个节点,初始化为-1,每加入一条新的边(u,v),都通过find()函数来查找u之前是否有一条到V的路,如果有,那么这条边就是原创 2017-11-12 19:53:41 · 581 阅读 · 0 评论 -
LeetCode 207. Course Schedule [Medium]
原题地址题目内容题目分析题目的意思为,在上某一门课前,可能会需要有前导课程,假设某学生需要上N门课,给出课程的前导课程,问是否能修完。大概就是判断一个图里面有没有环,有环的话就无法修完。首先遍历整个图,将每个节点的入度记录下来,维护一个队列,记录当前入度为0的节点,队列每弹出一个节点就对整个图的入度做一次修改,弹出的节点保存在res队列中,表示该门课程可以修完,最后看res的size是否与N相同。代原创 2017-11-18 12:53:52 · 242 阅读 · 0 评论 -
LeetCode 647. Palindromic Substrings[Medium]
原题地址题目内容题目分析求出当前字符串中有多少回文子串,从不同回文的中心向外扩展,计数。代码实现public int countSubstrings(String s) { int res = 0, n = s.length(); for(int i = 0; i<n ;i++ ){ for(int j = 0; i-j >= 0 && i+j < n &原创 2017-11-05 18:53:00 · 290 阅读 · 0 评论 -
LeetCode 712. Minimum ASCII Delete Sum for Two Strings [Medium]
原题地址题目内容题目分析标准的动态规划问题,题目的意思为删除s1,s2中的字符,使得最后s1=s2,要求使得删除的字符的值的和最小。dp[i][j]为字符串1前i个字符与字符串2前j个字符相等,需要减去的字符值。当s1[i-1]=s2[j-1]时,dp[i][j]=dp[i-1][j-1].当s1[i-1]!=s2[j-1]时,有两种选择,一删除s1的字符,那么dp[i][j]=dp[i-1][j]原创 2017-12-10 20:43:23 · 268 阅读 · 0 评论 -
Leetcode 406. Queue Reconstruction by Height[Medium]
原題地址題目内容題目分析题目的主要意思为,给你一串数组,让你对其进行“排序”,每个元素由两个值构成(a,b),a代表这个字符的大小,b代表有多少个比他大或者等于他的数字排在他前面,这就是最后生成的数组需要满足的条件。 首先我们可以对数组按照a进行从大到小的排序,如果a相同的话,就按照b来排,按照题目的要求,应该是b小的排在前面。定义一个结果数组res,排好序的数组在这个res里面的顺序,就是b的值原创 2017-12-21 20:16:17 · 296 阅读 · 0 评论 -
Leetcode 4. Median of Two Sorted Arrays[Hard]
原题地址题目内容题目分析看到题目第一眼想到的就是采用merge的做法,将两个数列从第一个开始比较排序,不过这样的做法复杂度就变为O(n),不符合题目的要求。后面参考了leetcode上面的discuss以及别人的博客,就采用了分治的做法,主要思想就是求数列中第k大的数。举个例子 代码实现double getkth(int* nums1, int size1, int* nums2, int si原创 2017-09-14 21:10:08 · 213 阅读 · 0 评论