ACM-数据结构
Kang_TJU
Talk is cheap!
展开
-
图算法小结
本目总结常见的图算法。kruskal构造mst,按边从小到大遍历,如果边的响铃节点位于不同的集合,那么该边是mst当中的一条边。这个地方需要并查集的知识。题目:[jobdu-1017]代码#include <iostream>#include <vector>#include <algorithm>#define N 100int tree[N + 8];struct Edge {原创 2017-09-10 18:15:25 · 312 阅读 · 0 评论 -
nyoj-257-中缀转后缀
问题题目:[nyoj-257]思路主要是需要一个操作符栈,对于操作数而言直接输出就行。 对于操作符栈,大致的规则很简单,就是如果当前元素优先级高于栈顶优先级,栈顶出栈。直到当前元素的优先级高于栈顶或者是栈为空,入栈。 最后。将栈中元素挨个出栈,附加到尾部即可。整体思路不难,比较麻烦的是对于对于操作符的优先级。主要是左右括号在栈外和栈内的优先级不同导致。同一级别的操作符,先入栈的优先级高。对原创 2017-03-06 15:17:25 · 492 阅读 · 0 评论 -
leetcode-111-Minimum Depth of Binary Tree
问题题目:[leetcode-111]思路递归的思路没有错,和求树的深度差不多。 但是,如果左枝或者右枝为空,需要单独考虑。代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * Tre原创 2017-02-26 21:51:00 · 326 阅读 · 0 评论 -
leetcode-236-Lowest Common Ancestor of a Binary Tree
问题题目:[leetcode-236]思路公共祖先,想法和前一道题目最初的做法一样。 找到他们两的路径,然后比较路径的最浅公共节点。当然,有主意特殊数据的情形。 如果p和q在不在树里,显然没有公共父亲。 所以,虽然实际题意没有考虑这种情形,但是我应该考虑。然后,在判断是否存在root==p || root==q这种情形,因为不用再比了。 肯定是公共节点了。这个题有点烦的是getPath的实现原创 2017-02-25 22:11:39 · 358 阅读 · 0 评论 -
leetcode-235-Lowest Common Ancestor of a Binary Search Tree
问题题目:[leetcode-235]思路先说一点,不管什么题。以做出来为标准。 这个题刚上来没有好的思路,只能说是把p和q的路径求出来,然后根据两条路径,从下往上寻找公共节点。 这个题稍微花了我点时间,主要是在求节点路径的接口设计上,参数用引用的方法没有用。值传递需要最后返回。返回后要判断是否需要进行另外一枝的搜索。代码/** * Definition for a binary tree n原创 2017-02-25 10:44:14 · 262 阅读 · 0 评论 -
leetcode-150-Evaluate Reverse Polish Notation
问题题目:[leetcode-150]思路典型栈的应用,后缀表达式计算。枚举每一个token,对于每一个token执行如下操作:如果是操作数,进栈如果是操作符,从操作数栈中弹出两个元素,进行计算,中间结果入操作数栈最后操作数栈中的结果就是最终结果代码class Solution {public: int evalRPN(vector<string>& tokens) {原创 2017-03-04 11:29:15 · 305 阅读 · 0 评论 -
leetcode-257-Binary Tree Paths
问题题目:[leetcode-257]思路深度优先即可。代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL),原创 2017-02-24 20:21:44 · 383 阅读 · 0 评论 -
leetcode-107-Binary Tree Level Order Traversal II
问题题目:[leetcode-107]思路层序遍历。 但是要保存每一层的节点。所以关键就是标记每一层的节点, 引入每一层最右端节点last。对于出队后的节点进行判断,如果是last。证明已经访问完本层所有节点,队列中目前的节点全部是下一层的节点。此时更新last即可。代码/** * Definition for a binary tree node. * struct TreeNode {原创 2017-02-24 19:58:26 · 273 阅读 · 0 评论 -
leetcode-20-Valid Parentheses
问题思路正常的匹配我就不说了,考虑两种特殊情形。 左括号个数大于右括号,当之前匹配成功的时候,最优的左括号会多。 右括号个数大于左括号时,当之前匹配成功的时候,栈会提前为空。给你“]”这种数据。代码class Solution {public: bool isValid(string s) { int sz = s.size(); if(!sz) ret原创 2017-03-03 17:19:59 · 412 阅读 · 0 评论 -
leetcode-155-Min Stack
问题题目:[leetcode-155]思路用一个变量min保存最小值肯定不行。 因为一旦该元素出栈,不行了。所以,建立辅助栈。这个栈保存曾经的最小元素。 当然,不会出现这个栈为空,而主栈不为空的情形。 比如,7,8,1 主栈 7->8->1 辅助栈 7->1 8一定会在7之前出栈,否则他就一定比8小。代码class MinStack {public: /** initializ原创 2017-03-03 17:48:52 · 434 阅读 · 0 评论 -
leetcode-501-Find Mode in Binary Search Tree
问题题目:[leetcode-501]思路常规题。遍历一遍,找出出现次数最大的值。 然后枚举哈希表即可。代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int原创 2017-02-15 22:34:03 · 984 阅读 · 0 评论 -
leetcode-167-Input array is sorted
问题题目:[leetcode-167]思路朴素的思路就是两层循环。但是TLE.代码(TLE)class Solution {public: vector<int> twoSum(vector<int>& numbers, int target) { int sz = numbers.size(); std::vector<int> ret;原创 2017-01-27 15:35:26 · 383 阅读 · 0 评论 -
leetcode-141-Linked List Cycle
问题题目:[leetcode-141]思路如果有环,枚举过程中,存在节点的指针重复出现。用集合记录即可。代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {原创 2017-01-25 14:47:45 · 336 阅读 · 0 评论 -
leetcode-224-Basic Calculator
问题题目:[leetcode-224]思路问题:中缀表达式计算分析:这个前面做过,有几个关键问题。怎么识别元素的问题。还有优先级一定不能变。先乘除后加减,同类运算符先进栈的优先级高输入:中缀表达式(字符串),没有空格处理: 1.读取表达式 2.循环:遍历表达式中每一个字符 2.1.如果是opnd,保存临时结果。 2.2.如果是optr原创 2017-03-10 10:07:35 · 398 阅读 · 0 评论 -
leetcode-142-Linked List Cycle II
问题题目:[leetcode-142]思路寻找环的入口,需要做如下的数学证明。先给出示意图如下: 做如下假设:设直线段的端点为O点O点环的入口点为A点A点快慢指针相遇的点为B点B点其中,有OA−→−=l,AB−→−=r0BC−→−=c,\overrightarrow{OA}=l, \quad\overrightarrow{AB}=r_{0} \quad\overrightarrow{BC}原创 2017-03-10 09:20:01 · 402 阅读 · 0 评论 -
leetcode-203-Remove Linked List Elements
问题题目:[leetcode-203]思路注意头结点的情形。代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solu原创 2017-01-20 22:20:32 · 421 阅读 · 0 评论 -
leetcode-128-Longest Consecutive Sequence 哈希表
问题题目:[leetcode-128]思路由于没有排序,并且要求在O(N)时间内完成。 考虑哈希表做映射,连续的序列一定在连续的部分命中。当然,如果用c写这个思路可以。但是如果c++用map做,只能是考虑前后两个元素的值是否相差1,从而来判断是否时连续序列。代码(c++实现)// c++ versionclass Solution {public: int longestConsecu原创 2016-11-16 20:12:08 · 396 阅读 · 0 评论 -
leetcode-81-Search in Rotated Sorted Array II 查找
问题题目:[leetcode-81]思路跟[leetcode-33]相比,主要是重复元素的问题。举两个例子: [3,5,5,5,1]和[5,1,1,1,3],对于这种情况,算法的其余部分基本不变。首先,是pivot的查找问题。 我做如下定义,如果一个序列存在一个升序对和一个降序对,那么我认为这个序列而存在一个逆序。那么现在的问题就转换为判断一个序列中是否存在一个逆序对。当前问题与之前问题的区别是原创 2016-11-06 23:14:46 · 400 阅读 · 0 评论 -
leetcode-33-Search in Rotated Sorted Array 查找
问题题目:[Search in Rotated Sorted Array]思路代码(c实现)// c versionint search(int* nums, int numsSize, int target) { if( NULL == nums || numsSize <= 0 ) return -1; for( int i = 0; i < numsSize; +原创 2016-11-05 15:22:05 · 494 阅读 · 0 评论 -
疯狂队列-网易2018校招内推
问题题目:[疯狂队列]思路这种题目应该算是所谓的找规律题目,找到了之后,两边分别开始放。其实,规律背后应该是有数学证明的,但是这个暂时先省略。笔试的时候没时间,拿到了只能去试了。 这个题我觉得值得一说是,利用deque能稍微快点搞定。 对于最后一个元素位置的选择要判断。代码#include <iostream>#include <vector>#include <algorithm>#in原创 2017-08-15 21:09:00 · 589 阅读 · 0 评论 -
jobdu-1447-最短路
问题题目:[jobbu-1447]思路DIJKSTRA( G, w, s ){ 1.INITIALIZE-SINGLE-SOURCE(G,s) 2.S = EMPTY 3.Q = V[G]; 4.while Q!=EMPTY 4.1 do u = EXTRACT-MIN(Q); 4.2 S = S U {u}; 4.3原创 2017-08-22 21:08:38 · 333 阅读 · 0 评论 -
leetcode-112-Path Sum
问题题目:[Path Sum]思路下面的代码并不是原始问题的代码。而是改良后的问题。即求一条路径和为sum。要求必须从根开始,但是不一定到叶子结束。 下面用到了回溯法,我觉得这题也是回溯法比较好的实现。 回溯法肯定用到了“剪枝”,但他的关键是要回溯到上一个状态。代码/** * Definition for a binary tree node. * struct TreeNode { *原创 2017-02-07 13:24:38 · 292 阅读 · 0 评论 -
图-hdu-1233
问题题目:[hdu-1233]http://acm.hdu.edu.cn/showproblem.php?pid=1233思路这个题是MST,不多说了。 结合UnionFindSet搞定联通分量的合并。代码#include <cstdio>#include <cstring>#include <vector>#include <algorithm>#define N 100//#defi原创 2017-07-04 18:18:05 · 229 阅读 · 0 评论 -
图-hdu-1272
问题题目:[hdu-1272]思路无向图,联通,没有环,只能说明它是生成树。特点:n个节点,n-1条边。注意,最小生成树是权值最小的生成树,仅此而已。它也是生成树。代码#include <cstdio>#include <set>//#define LOCALusing std::set;int main( void ){#ifdef LOCAL freopen( "../data/原创 2017-07-04 15:06:55 · 356 阅读 · 0 评论 -
leetcode-437-Path Sum III
问题题目:[Path Sum III]思路这个题目其实挺好的,感觉对于preOrder的理解一下又上升了一个层次。 当然,这个题本身我没做出来。实际做的时候,只能说做出了一部分。还是对于遍历这件事本省立即的不充分。还有对于递归的语义没有想清楚。 这到题麻烦的一点是说:不一定从根节点开始,你可以从任意节点。只要是从它开始字段和为sum即可。那这个题的解法不就是,遍历每一个点,然后从每一节点开始寻找原创 2017-02-22 11:23:43 · 390 阅读 · 0 评论 -
leetcode-113-Path Sum II
问题题目:[leetcode-113I]思路和之前的那一道只是在接口上有区别而已。代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x),原创 2017-02-07 16:03:09 · 400 阅读 · 0 评论 -
leetcode-504-Diameter of Binary Tree
问题题目:[leetcode-504]思路刚上来的时候做错了,因为觉得二叉树的直径一定要经过root。所以我求出了左右子树的深度,加起来获得答案。 思路是不对的,因为直接可能是不经过root的。这点很重要。 那么我的思路是,对于每一个节点,就出经过他的最大直径。 然后,二叉树的直接就是这些当中最大的。代码/** * Definition for a binary tree node. *原创 2017-03-25 00:32:37 · 308 阅读 · 0 评论 -
leetcode-504-Diameter of Binary Tree
问题题目:[leetcode-504]思路刚上来的时候做错了,因为觉得二叉树的直径一定要经过root。所以我求出了左右子树的深度,加起来获得答案。 思路是不对的,因为直接可能是不经过root的。这点很重要。 那么我的思路是,对于每一个节点,就出经过他的最大直径。 然后,二叉树的直接就是这些当中最大的。代码/** * Definition for a binary tree node. *原创 2017-03-25 00:32:35 · 319 阅读 · 0 评论 -
leetcode-83-Remove Duplicates from Sorted List
问题题目:[leetcode-83]思路前后指针,注意循环不变式。p的更新在不同分支不一样。代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }原创 2017-01-24 19:39:56 · 361 阅读 · 0 评论 -
leetcode-24-Swap Nodes in Pairs
问题题目:[leetcode-24]思路注意循环设置的条件。只设置一个判断,一个跳出我觉得没什么意义。所以,都跳出。代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(N原创 2017-01-24 19:33:46 · 327 阅读 · 0 评论 -
leetcode-169-Major Element
问题题目:[leetcode-169]思路哈希表。代码class Solution { public: int majorityElement(vector& nums) { int sz = nums.size(); std::map<int, int> counter; for(int i = 0; i < sz; ++i){ coun原创 2017-01-18 12:38:07 · 474 阅读 · 0 评论 -
leetcode-404-Sum of Left Leaves
问题题目:[leetcode-404]思路这个题刚开始想用递归写,一时每反应过来。 然后想层次遍历,一时又没反应过来。 其实,基本的算法还是遍历。层次遍历即可,但是只要左叶子。 所以,我考虑加标签,主要是想模仿线索二叉树。然后写了一个结构,加了是左孩子右孩子的标签。问题搞定。代码/** * Definition for a binary tree node. * struct TreeNo原创 2017-01-16 22:57:26 · 350 阅读 · 0 评论 -
leetcode-1-TwoSum 哈希表
问题题目:leetcode-1思路首先,朴素的思路非常容易想。O(n2)O(n^{2})的复杂度。 改用hash表去做。 大致分两步,记录每个元素位置循环:枚举每一个元素 2.1. 用target - 当前元素,获取对应元素。 2.2. 判断对应元素是否在hash表中 2.2.1. 若在,判断两元素是否一样 2.2.1.1 如果不一样,找到一对匹配,返原创 2016-11-01 21:05:08 · 493 阅读 · 0 评论 -
leetcode-383-Ransom Note
问题题目:[leetcode-383]思路哈希表记录一下。代码class Solution {public: bool canConstruct(string ransomNote, string magazine) { int hash[128]; std::memset( hash, 0, sizeof(hash) ); int sz_m原创 2017-01-13 16:05:14 · 266 阅读 · 0 评论 -
leetcode-104-Maximum Depth of Binary Tree
问题题目:[leetcode-104]思路递归,当然直接这么想也行。树的最大深度等于左子树的最大深度和右子树最大深度的最大深度+1。只不过觉得树的最大深度和树的深度有什么区别。代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * Tr原创 2017-01-06 10:09:00 · 292 阅读 · 0 评论 -
leetcode-3-LongestSubstringWithoutReaptingCharacters
问题题目:[leetcode-3]思路暴力法。枚举所有子串。按行枚举。 枚举以s[i]为头的所有子串,如果当前子串存在重复元素,跳出。i = i + 1; 注意hash表的清空操作。代码class Solution {public: int lengthOfLongestSubstring(string s) { int sz = s.size(); i原创 2016-12-25 21:10:15 · 438 阅读 · 0 评论 -
leetcode-2-AddTwoNumbers
问题题目:[leetcode-2]思路思路比较简单,但是不容易一次把所有情形考虑正确。大的框架是merge的思路。但是进位的处理要小心。最后在p,q都为空的情形再次处理进位。代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * Lis原创 2016-12-23 14:01:22 · 339 阅读 · 0 评论 -
leetcode-283-Move Zeros 顺序表
问题题目:[leetcode-283]思路代码// c versionvoid moveZeroes(int* nums, int numsSize) { if( NULL == nums || numsSize <= 0 ) return ; for( int i = 0; i < numsSize - 1 ; ++i ) { if( !nu原创 2016-11-07 23:54:04 · 484 阅读 · 0 评论 -
leetcode-9-palindrome 顺序表
问题题目:[leetcode-9]思路回文的思路,但是关键是不许借助额外空间。代码其实这么做,不符合要求。但是也过了。class Solution {public: bool isPalindrome(int x) { std::stringstream ss; ss << x; std::string ret; ss >>原创 2016-12-16 18:02:50 · 351 阅读 · 0 评论 -
leetcode-26-Remove Duplicates from Sorted Array 顺序表
问题题目:[leetcode-26]思路这个题目在数据结构实现的地方复习过,思路设置重复元素个数变量。 每次前移操作为 nums[i - k] = nums[i];代码class Solution {public: int removeDuplicates(vector<int>& nums) { map<int, bool> mapper; int sz原创 2016-11-01 21:47:34 · 502 阅读 · 0 评论