ACM/算法
UpCoderXH
这个作者很懒,什么都没留下…
展开
-
[leetcode] Path Sum III
Path Sum III问题描述:给定一颗二叉树,计算有多少条路径的sum等于一个target。路径的定义为从起点和终点之间依次都满足是后者是前者的孩子。如下图所示:问题分析:针对每个节点,我们可以记录从跟节点到该节点所经历的所有value -> paths。然后我们计算该点和前面所有点的value和等于sum的个数。同样的我们递归计算该点的左孩子,右孩子。最终的结果等于c...原创 2019-07-07 18:05:05 · 136 阅读 · 0 评论 -
[leetcode] MinimumWindowSubstring && SlidingWindowMaximum
MinimumWindowSubstring问题描述:给定一个字符串A和字符串B,在A中找到最短的一个连续子字符串,使其包括B中的所有字母。比如说:A=‘ABCDEFG’, B = ‘EG’, 则最短的子字符串是EFG。解决思路方法一:利用两个map首先,我们把B中所有字母出现的次数保存成一个map T类型的数据(没有非法输入的情况下可以用128纬的vector来提高效率)。然后我...原创 2019-04-27 22:25:40 · 102 阅读 · 0 评论 -
[leetcode] 二叉树相关题目
中序遍历二叉树递归做法void inorderTraversalBase(TreeNode* root, vector<int>& res){ if(root == NULL) return; inorderTraversalBase(root->left, res); res.push_back(root->val...原创 2019-05-01 22:14:12 · 176 阅读 · 0 评论 -
[leetcode] UniquePathsI, II, III
UniquePaths问题描述:给定一个起点和终点,找到一共有多少条满足条件的路径。Unique Paths I给定一个矩阵,起点在左上角,终点在右下角。只能向下走或者向右走。思路:我们当然可以用DFS来做,但是时间复杂度就是O(2(M∗N))O(2^{(M*N)})O(2(M∗N))。所以我们采用动态规划的方法来做。转移方程如下:dp[i][j]=dp[i−1][j]+dp[i...原创 2019-04-26 21:56:29 · 242 阅读 · 0 评论 -
[剑指offer] 二叉搜索树和双向链表的转化
题目:二叉搜索树和双向链表的转化二叉搜索树里面每个节点有两个指针,分别指向left 和 right。双向链表内的每个节点也有两个指针,分别指向left 和 right。所以,两者是可以相互转化的。我们知道二叉搜索树的中序序列有序的。所以我们基于中序序列来将其转化为双向链表。对于每一个节点来说,它的left是它中序遍历的上一个元素,right是中序遍历的下一个元素。所以在中序遍历的过程...原创 2019-04-09 17:00:44 · 116 阅读 · 0 评论 -
[leetcode] Edit Distance
计算两个字符串之间的编辑距离假设有两个字符串str1和str2的编辑距离是D假设str1[0] = str2[0],则D = distance(str1[1:], str2[1:])假设str1[0] != str2[0], 则我们有一下几种做法将str1[0] 替换成 str2[0], 则 D = distance(str1[1:], str2[1:]) + 1将str1[0] ...原创 2019-03-25 21:48:21 · 98 阅读 · 0 评论 -
[Leetcode] KMP
题意:给定一个字符串text,和一个模式串pattern。让你判断text是否包含pattern,如果包含,则返回text中出现pattern的第一个字符的坐标。否则返回-1。如果pattern是空字符串(长度为0),则返回1解法1—暴力:我们遍历text的每个位置i,并从i开始遍历长度为sizepsize_psizep的字符串,看其是否和pattern相等,如果相等返回i,否则继续遍历。...原创 2019-01-15 21:19:00 · 2090 阅读 · 0 评论 -
[leetcode] Regular Expression Matching
题意:让我们实现正则表达式的isMatching函数,判断包含正则表达式的p是否能匹配上字符串s。其中p只包含两种特殊字符。.和*,前者也可以匹配任意字符,后者可以重复前一个字符0~多次。解法:解法1,递归,分情况讨论s,p长度都为0,则返回trues长度不为0,p长度为0,则返回falses长度为0,p长度不为0,这种情况下只有p的格式是cc才可以匹配,否则都为false。两者...原创 2019-01-09 16:19:06 · 489 阅读 · 0 评论 -
[leetcode] MergedKSortedList && ReversedNodesinKGroup
第一题:MergedKSortedList题意:给定了K个有序单向的list的第一个节点,让给返回将这K个List合并后的List的首节点思路1:每次比较K个list的当前节点,选出最小的,加入result的list中。直到K个list都遍历完成。思路2:2分法合并,首先利用二分法将其分成两两list,然后再合并两两list,直到最后合并完成。思路3:利用最优队列,将所有点加入到最优队...原创 2019-01-14 21:23:44 · 96 阅读 · 0 评论 -
[leetcode] 3sum && 4sum
题意:给定n个数,让我们在其中选择3个或者是4个,使其的和等于一个target,找出所有的存在的解法,并没有重复。本质上是对2sum的扩展,我们在面对2Sum问题的时候,首先对数组nums进行一个排序,然后维护两个指针,一个从小到大,一个从大到小的遍历整个数组,直到这两个指针相遇。- r=0, l=nums.size()- 当r<l的时候 - 如果nums[r] + nums[l...原创 2019-01-12 15:48:20 · 166 阅读 · 0 评论 -
[leetcode] Next Permutation && Longest Valid Parentheses
今天我们主要分享两道题的做法—Next Permutation和 Longest Valid ParenthesesNext Permutation题意:给定一个数组nums,修改这个数组里面数字的顺序,使得修改后的数组的数字排序刚好比修改前的数组顺序的字典序大一个。比如说比1,2,3字典序大一的就是1,3,2。如果不存在这样一个序列(整个数组按照从大到小排列),则返回从小到大的序列。思...原创 2019-01-17 20:28:17 · 124 阅读 · 0 评论 -
[leetcode] RomanToInteger、IntegerToRoman和Container With Most Water
今天主要分享三道题Container With Most Water题意:给一系列的高度为hih_ihi的木板,彼此之间的距离为1个单位长度。问任选两个木板组成的容器面积最大是多少?解法1:暴力,遍历所有组合,时间负责度是O(n2)O(n^2)O(n2),代码如下:int maxArea(vector<int>& height) { i...原创 2019-01-10 13:08:13 · 104 阅读 · 0 评论 -
PAT-The Largest Generation
PAT-The Largest Generation原创 2017-07-28 20:06:03 · 236 阅读 · 0 评论 -
PAT-Forwards on Weibo
原题链接:Forwards on Weibo题目大意:给你一个有向图、起点和最远能走的步数,让你计算一共可以经历多少个点解法:无非就是遍历,给定起点,我们利用广度优先遍历的算法来做,使用queue来存储每一个节点,注意,在这里我们不仅仅要维护每个节点的坐标还要维护一个length值,代表的是从起点走到当前节点的路程距离,这个举例不能超过题中给出的约束条件。代码如下:#include <ios原创 2017-08-13 20:48:11 · 285 阅读 · 0 评论 -
PAT-Acute Stroke
题意:给定一个三维的数组,由0和1组成,如果一个联通分量中1的个数大于t,则该联通分量满足条件,问三维数组中满足条件的联通分量中的1 的个数。解法: dfs:利用递归来遍历所有满足条件的点bfs:利用queue来记录走过点的位置 本题使用dfs会出现段错误,因为递归次数太多了,所以我们使用bfs作为正确的解法代码如下: bfsint count_point_queue(bool ma原创 2017-07-27 21:07:44 · 282 阅读 · 0 评论 -
PAT-Build A Binary Search Tree
原题链接:Build A Binary Search Tree题目大意:给你一个数组,让你将其按照指定的二叉搜索树的结构排序,最后输出这颗二叉搜索树的层次序遍历结果。解法:原以为还需要我们自己手写二叉搜索树的构建,最后才发现不用,我们只要将这个数组排好序,再对号入座到响应的位置,然后输出遍历结果就好。那我们怎么找到相应的位置呢? 我们可以找到二叉树中每个节点对应的value值,怎么找呢?我们原创 2017-08-11 21:01:26 · 204 阅读 · 0 评论 -
堆排序
在这里我们主要讲解一些最大堆排序的过程。先来一段百度百科的介绍:堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可原创 2017-08-11 10:40:33 · 225 阅读 · 0 评论 -
[leetcode] Subsets Subsets II
Subsets, Subsets IISubsets问题描述:给定一个不重复的数组A,让计算A中所有数字的排列组合解决思路:利用DFS来计算所有的组合。例如A中的数字是1~3首先我们可以选择{}->{1} -> {1, 2} - >{1, 2, 3} - >{1, 3} - >{2} - > {2, 3} -> {3}对于第i个数字,我们...原创 2019-04-28 23:12:55 · 187 阅读 · 0 评论 -
[leetcode] WordSearch WordSearchII Trie
WordSearch、WordSearchII、TrieWordSearch问题描述:给定一个二维数字,每个元素都是字符char, 再给定一个字符串s,问在二维数组中能否找到一条路径刚好是s。每次可以走四个方向,二维数组中的每个字符最多走一次(不能重复)。例如ABCCED就是从(0, 0)开始的红线SEE是绿线思路:利用DFS,找到与word相同的路径返回即可,找不到返回fa...原创 2019-04-29 23:21:42 · 158 阅读 · 0 评论 -
[leetcode] Target Sum
Target Sum问题描述:给定一个数组A(元素为非负),你需要在A中每个数字前面加上+或-。然后让其和为S。问题分析:假设A中所有元素的和TS,则所能生成的所有sum的区间应该[-TS, TS]。对于第i个数,我们将计算其和为x的解决方法个数y,记为dp[i][x] = y.dp[i][x] = dp[i-1][x + nums[i]] + dp[i-1][x - nums[i]];...原创 2019-07-07 17:41:56 · 117 阅读 · 0 评论 -
[leetcode] BestTimeSellStock I, II, III, IV
BestTimeSellStock I问题描述:给定一组数字,代表每天股票的价格。假定现在只能进行一笔交易,计算出所能获得利润的最大值。解法:针对每个价格,我们只要知道它前面价格的最小值即好。所有我们可以遍历整个数组,并用一个数字代表之前的所有数字的最小值。所以针对数组里面的每个数,我们都能获得一个如果在该点卖出的最大利润值。我们计算这些利润值里面的最大值即可。时间复杂度:O(N), 空间...原创 2019-05-18 11:49:41 · 296 阅读 · 0 评论 -
[leetcode] Longest Increasing Subsequence
Longest Increasing Subsequence问题描述:计算一个数组的最长上升子序列。这个子序列内的元素不一定要是相邻的。比如说数组{1, 100, 2, 3, 4}的LIS就为{1, 2, 3, 4}解法1-动态规划首先我们将问题划分成子问题=>我们该序列一定是以某一个点为起点的。所有我们另dp[i]表示以i为起点的LIS长度。构造父问题的解。假设说我们已经知道了...原创 2019-05-17 16:12:20 · 116 阅读 · 0 评论 -
[leetcode] PerfectSquares
PerfectSquares问题描述:首先定义完美数字是{1, 4, 9, 16 … , n^2}.然后给定一个整数N,试计算N最少由几个完美数字求和得到。比如12=4+4+4,13=4+9分析:对于一个数字N,它所能选择的最大完美数字就是int(sqrt(N))^2=X。所以对于N的结果他可以由min{N-{1,4,…,X}} + 1构造得到。所以该题是一个动态规划的题目。dp[...原创 2019-05-16 23:09:41 · 98 阅读 · 0 评论 -
[leetcode] PalindromeLinkedList
PalindromeLinkedList问题描述:给定一个单向链表,试判断该链表是否是回文链表。解决思路1因为该链表是单向的,所以我们不能想vector那样从后向前访问。所以我们可以先将ListNode存储起来,然后再判断或者是说我们可以利用递归的方法来判断。我们首先用tmp保存head元素。然后利用递归遍历head,访问每一个元素。访问最后一个时候比较该元素和tmp如果...原创 2019-05-16 23:00:35 · 91 阅读 · 0 评论 -
[leetcode] LowestCommonAncestor
LowestCommonAncestor问题描述:给定一颗二叉树,和二叉树的两个节点,计算出这两个节点的最低公公祖先。解法1:最低公公祖先可能出现的最高值就是根节点。我们找到从根节点到两个节点的路径,path1和path2.则两者一定是Y字型或者是V字形(root节点)则我们就把问题转化成了计算两个list的相交点问题。首先长的path先走他们之间长度差值步,使得后续的两个pat...原创 2019-05-16 22:38:39 · 1113 阅读 · 0 评论 -
[leetcode] findDuplicateNumber
FindDuplicateNumber问题描述:给定一个数组长度为N,里面元素的取值范围是1~N-1。所有会有一个数是重复的,请找到这个重复的数字并返回。解法1:暴力最直接的办法就是利用两重循环来寻找当碰到相同的数字的时候就返回时间复杂度是O(N)解法2: 二分法我们知道我们N个数是分布在1~N-1之间的。所有假设我们统计1~N/2, N/2-N-1之间的数字,如果哪一方的...原创 2019-05-16 22:10:20 · 169 阅读 · 0 评论 -
[leetcode] ReverseListI II
ReverseList I, II问题描述,给定一个list,起点m,终点n。试只遍历一次链表达到将m->n之间反转的目的。对于I来m=第一个节点,n=最后一个节点。我们可以假设0<=m<=n<=length of the list.分析:因为我们只能遍历一次列表,所以我们考虑在遍历列表的时候计数,计算当前是第几个节点。假设当前是第i个节点。如果i<m我们不操作...原创 2019-05-12 13:57:26 · 103 阅读 · 0 评论 -
[leetcode] Maximal Square
Maximal Square问题描述:在一个给定的矩阵中,找到一个最大的方阵。矩阵中的元素都是0或者1.方阵内的元素要求都是1.动态规划:dp[i][j]代表以ij结束的点所能构成的最大方阵的边长。转移方程dp[i][j] = min{dp[i-1][j-1], dp[i-1][j], dp[i][j-1]} + 1. 注意这里min相当于计算交集。//// Created b...原创 2019-05-15 23:25:36 · 83 阅读 · 0 评论 -
[leetcode] CourseSchedule
CourseSchedule问题描述:输入一个n代表我们有N门课程,编码成0-n-1, 然后给一系列课程的前置条件,问这样安排课程是否合理。问题可以转化成判断图中是否有环的问题。我们将每门课程看成一个节点。前置条件是条有向的边。所有图是有向图。如果图中存在环则前置课程必定存在冲突,否则则不冲突。是否存在环?解法1我们首先计算每个节点的入度。将所有入度为0的节点加入队...原创 2019-05-15 23:22:31 · 141 阅读 · 0 评论 -
[leetcode] HouseRobI, II, III
HouseRob I问题描述:一个强盗要抢劫一个房屋,但是他不能抢连续的两个房间,比如说ABC房间,他只能抢A和C或者是B,否则就会触发警报,将其抓住。我们知道每个房间都有money,并且money>=0的。这个题我们可以看作动态规划来解决。划分子问题 dp[i]表示的是从第1个房间到第i个房间,所能抢到的最大金额。根据子问题求解父问题 dp[i] = max(dp[i-2] +...原创 2019-05-10 14:40:12 · 87 阅读 · 0 评论 -
[leetcode] Sort List
Sort List问题描述:尝试用O(nlgn)的时间复杂度,O(1)的空间复杂度对一个链表排序分析因为是O(nlgn)的时间复杂度,所以我们第一感觉就是快排是否可以?因为对于每一段数组来说,快排即需要从前向后也需要从后向前。所以对于我们的单向链表来说有点不适合。那么另一个排序方法:归并排序呢?归并排序常规的做法是up-to-bottom,即先分只一个元素,然后再合并。但...原创 2019-05-08 22:50:27 · 100 阅读 · 0 评论 -
[leetcode] WordBreak && MaximumProductSubarray
今天这两道题是两道动态规划的题目。Word break问题描述:给定一个字符串s,和一个字典d。试问有没有办法使用d中的字符串构造出s。d中的每个字符串可以使用多次。分析最直观的解法肯定是暴力搜索。我们遍历d中所有组合,看能否构成s。如果不能则返回false,如果可以则返回true。这种暴力搜索肯定是超时,那么我们是否还有其他做法呢?我们试想如果s中的每个字符c,我们都可以在d...原创 2019-05-08 22:30:10 · 112 阅读 · 0 评论 -
[leetcode] Longest Consecutive Sequence
Longest Consecutive Sequence问题描述:给定一个乱序的数组,让你计算最长的包含连续数字的子集大小是多少?要求O(n)的时间复杂度。比如说[100, 0, 2, 1, 100, 3, 5, 200, 4] => {0, 1, 2, 3, 4, 5}.所以长度是5.分析对于这么一个乱序的数组,并且要求O(n)的时间复杂度,所以我们肯定不能排序。我们首先可以利...原创 2019-05-08 22:05:03 · 142 阅读 · 0 评论 -
[leetcode] BinaryTreeMaximumPathSum
Binary Tree Maximum Path Sum题意:从二叉树的任意一个起点出发,到另一个点所经过的路径和最大。注意,这里的路径就包含了一个点最多只能经过一次。分析:我们最大路径一定是要路过某些点的(不支持路径长度为0)。我们的路径都可以抽象成如下所示的路径。左边的长度和右边的长度都可以为0。所以我们就是要计算所有类似路径的长度之和。按照上面的思路,我们已经将问题转化成了所有类似...原创 2019-05-08 21:51:50 · 106 阅读 · 0 评论 -
[leetcode] LargestRectangleHistogram MaximalRectangle
LargestRectangleHistogram问题描述:给定一个直方图,假设每个bar的width为1,高度不定。计算直方图中所能构成最大矩阵的面积。比如下图中的直方图,所能构成的最大面积就是10.-分析:假设直方图的左边起点是L,右边起点是R。则如果LR全用的话,则所构成的面积一定是(R−L)∗Hmin(R-L)*H_{min}(R−L)∗Hmin, HminH_{min}Hmin...原创 2019-04-30 16:45:24 · 141 阅读 · 0 评论 -
PAT-Insertion or Heap Sort
题目链接:Insertion or Heap Sort大意:给你两个数列,第二个是第一个通过某种排序算法过程中产生的一个状态序列。让你判断此时使用的是插入排序还是堆排序,并且输出下一个状态的序列。很暴力的解法,把排序的每一个状态都记录下来,然后一一比对,最后输出下一个状态序列。我们直到插入排序时间复杂度是O(N^2),但是本题数据量也较少,n<=100。所以没有问题。不论堆排序还是插入排序,记录原创 2017-08-11 10:48:58 · 284 阅读 · 0 评论 -
PAT-All Roads Lead to Rome
一开始写的dfs,但是提交上去之后超时了,所以最后就改成扩充版本的dijkstra算法首先我们回顾一下基本的dijkstra算法,基本的dijkstra算法是用来计算最短路径的,他的关键在于维护了一个起点到所有点的最短距离d数组,通过每次找到最短距离里买嗯还没有用过的点,来更新我们的d数组。假设我们的终点index是t,那么我们到终点的最短距离就是d[t]然后我们将问题抽象一下,其实该题就是让算原创 2017-07-25 19:30:51 · 936 阅读 · 0 评论 -
HDU_1114_背包问题
题意就是:给你一定的空间,一定种类的硬币,每种硬币可以重复使用多次,让我们计算每次的最大字原创 2014-09-03 18:49:57 · 577 阅读 · 0 评论 -
HDU_2602_背包问题
DescriptionMany years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , such as dog’s , cow’s , also he went to the grave … Th原创 2014-09-03 19:45:33 · 599 阅读 · 0 评论 -
POJ 珍惜昆虫的繁殖问题
#include #include #include #define MAX_N 5000#define MAX_K 1000005using namespace std;//完成n个元素的初始化int x[MAX_K];int y[MAX_K];int n,k;int par[MAX_N];int rank[MAX_N];void init(int n){ f原创 2014-07-25 19:34:28 · 1060 阅读 · 0 评论