leetcode
leagalhigh
never give up!
展开
-
leetcode-107. Binary Tree Level Order Traversal II-BFS
//107. Binary Tree Level Order Traversal II //过程:第一次出错:queue没有top函数 // 第二次:stack没有begin,end、clear函数 //总结:基本STL掌握的还不够。 C++代码:#include <cstdio> #include <cstring> #include<algorithm> #include原创 2017-04-10 09:38:41 · 365 阅读 · 0 评论 -
leetcode-310. Minimum Height Trees
考察点:图,遍历,bfs,路径; 思路:这个题就是从叶子节点开始遍历,去除掉当前所有的叶子节点后,再从新图的叶子节点开始遍历,直到最后剩下一个或者两个叶子节点,就是最深的那个点。C++ 代码:class Solution {public: vector<int> findMinHeightTrees(int n, vector<pair<int, int>>& edges) {原创 2017-05-09 10:34:12 · 176 阅读 · 0 评论 -
leetcode-133. Clone Graph
考察点:图,DFS; 思路:就是用一个map记录对应label的node指针,克隆了的话就直接返回指向该node的指针,没有的话就new一个然后再对它进行递归添加节点。这个函数返回的是一个节点,而且该节点的所有neighbors都找全了,所以mp中有的话就直接返回就行。要从宏观角度看这个函数。C++代码:/** * Definition for undirected graph. * stru原创 2017-05-10 09:47:30 · 177 阅读 · 0 评论 -
trie树-leetcode-421. Maximum XOR of Two Numbers in an Array
考察点:trie树,还有一种set方法,思路类似; 思路:首先建立trie字典树,它记录了这些nums中从最高位第32位(脚码是31)开始建立二叉树,只有0,1,建立的时候是对每一个数字,按照从高位到低位的顺序遍历各个位; 然后就是寻找XOR的最大数值了,它是由这颗树root跟nums中的每一个num产生的,对于每一个num,依次将它的每一个位与trie树中的节点比较,若能异或为1,就将ret的该原创 2017-05-19 00:48:48 · 394 阅读 · 0 评论 -
leetcode-530. Minimum Absolute Difference in BST
考察点:平衡二叉树性质,遍历特点; 思路:BST中序遍历是有序的; C++ 代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x),原创 2017-05-19 09:38:00 · 349 阅读 · 0 评论 -
leetcode-624. Maximum Distance in Arrays
考察点:数组,比较大小; 思路:很简单,找出最大和次大的数,找出最小和次小的数,如果最大最小的数的脚码不同,就直接算绝对值,否则,把次大次小加进去计算最大绝对值。(我的代码很丑,以后不能用数组存储值和脚码,应该善用struct) C++代码:class Solution {public: int abs(int a, int b) { return a>b?(a-b):原创 2017-06-18 11:49:12 · 348 阅读 · 0 评论 -
leetcode-623. Add One Row to Tree
考察点:递归, 二叉树; 思路:递归思想;很重要的是help函数的处理,它要返回指针,而且它的功能是返回最终的root,这个root是满足条件的root。当然,help函数里还要递归,确定好为NULL的条件和depth==curdepth这两个结束条件就ok了。 C++代码:/** * Definition for a binary tree node. * struct TreeNode原创 2017-06-18 12:24:48 · 410 阅读 · 0 评论 -
leetcode-625. Minimum Factorization
考察点:简单的运算问题。 思路:从9到2遍历,思路简单,但需要注意的细节很多,首先应该用long long接受ret,如果是超出范围的的则return 0;然后a为1的情况下应该退出循环;循环外a不为1的情况下return 0; C++代码:class Solution {public: int num[10] = {2,3,4,5,6,7,8,9}; long long po原创 2017-06-18 17:03:10 · 793 阅读 · 0 评论 -
537. Complex Number Multiplication
题目很简单,简单的逻辑和字符串处理,但是仍花了不少时间,具体浪费在:1. 写重了变量,细节问题; 2. C++的substr和字符串和int的转换,真的很细节。比起python,C++的好多功夫都浪费在细节上了呢。C++代码:class Solution {public: struct Complex{ string first_str; strin原创 2017-06-29 00:03:48 · 208 阅读 · 0 评论 -
372. Super Pow
考察点:递归,幂运算; 思路: superPow看成一个模块,它输入一个基数和数组,求出结果;但是它是递归地去求结果,每次去掉最后一位,然后利用powmod这个功能模块函数,返回最后结果。这个递归的思想想到的话可以极大地减少时间复杂度。C++代码:class Solution { const int base = 1337; int powmod(int a, int k) //a原创 2017-07-02 20:40:16 · 270 阅读 · 0 评论 -
leetcode-50. Pow(x, n)
考察点:递归,二分法; 思路:这道题是求幂的递归,二分的经典例题。其中如果int为INT_MIN,这个需要特殊对待。 C++代码:class Solution {public: double myPow(double x, int n) { if (n == 0 ) return 1.0; if(n == INT_MIN)原创 2017-07-02 21:27:15 · 214 阅读 · 0 评论 -
19. Remove Nth Node From End of List
考察点:链表,指针; 思路:过滤掉特殊情况,然后是通用情况; C++ 代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */cl原创 2017-09-05 00:06:59 · 232 阅读 · 0 评论 -
leecode-385. Mini Parser
考察点:stack思想,类思想,C++function用法,等C++函数用法。 思路:首先创建一个外部的总对象,然后遍历字符串,根据是否是[ 或者 ]来进行入栈和出栈来形成一个类链表。最后输出链表的头部。 C++ 代码:/** * // This is the interface that allows for creating nested lists. * // You should原创 2017-09-25 13:41:40 · 159 阅读 · 0 评论 -
236. Lowest Common Ancestor of a Binary Tree
考察点:DFS; 思路:首先根据一个搜索出到两个指针所指对象的path,存放在vector中,然后反转该vector,前面的元素是从根节点出发的节点路径,找出第一个不同的元素,返回之前的元素就可; C++ 代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNod原创 2017-09-25 14:25:12 · 162 阅读 · 0 评论 -
leetcode-648. Replace Words
考察点:trie树,指针; 思路:根据dict生成trie树,判断是否是_is_end时需要留意。C++代码:class Solution {public: struct TrieNode{ bool _is_end; TrieNode * next[26]; TrieNode(){ _is_end = false;原创 2017-09-03 10:22:49 · 300 阅读 · 0 评论 -
leetcode-402. Remove K Digits
考察点:栈,贪心; 思路:贪心的思路就是从左往右遍历,第一个遇到的char要放入栈中,后面的char如果小于栈顶元素,应该出栈,更换栈顶元素。C++ 代码:class Solution {public: string removeKdigits(string num, int k) { if (k == num.size() || num.size() == 0) ret原创 2017-10-07 16:31:44 · 207 阅读 · 0 评论 -
393. UTF-8 Validation
思路:遍历一遍vector,按要求判断; C++代码:class Solution {public: int num_of_bytes(int a) { int i = 0; while (a & (1<<(7-i))) { if (i > 4) return i; i++;原创 2017-09-30 20:22:57 · 212 阅读 · 0 评论 -
leetcode-394. Decode String
考察点:栈的使用,解析字符串 思路:使用两个栈:一个数字栈,一个string栈;数字栈栈顶表示string栈栈顶string的重复次数。从头到尾遍历string,遇到数字要提取数字,并压入数字栈,遇到 ‘[’要压入string栈空的string,遇到字母要将string栈栈顶的string拼接这个字母然后压栈,遇到‘]’要将string栈和num栈出栈重新拼接新的string入栈。最后在循环外要将原创 2017-10-06 13:11:17 · 216 阅读 · 0 评论 -
leetcode-399. Evaluate Division
这道题考察图,dfs; 思路:关键是要用好stl,平时用的下标取double值,但是C++里就要unordered_map来存储,思路还是那样:首先将图初始化,from和to都应该存入mp中(双向的); 然后开始对每一个queries进行dfs;如果有一个query不存在于mp里,就将ret中放入-1.0, 否则说明可以到达,开始dfs:如果from == to 则放入-1.0, continue原创 2017-05-08 22:15:39 · 299 阅读 · 0 评论 -
树状数组-线段树模板题(leetcode-307)
考察点:树状数组,线段树; 树状数组就是声明一个新的数组来表述树状数组,然后根据树的二进制特征进行update和getSum。线段树是根据数组生成一棵树。 下面是经典的树状数组代码:class NumArray {public: vector<int> tree; vector<int> Nums; int len; NumArray(vector<int> n原创 2017-05-16 10:25:55 · 913 阅读 · 0 评论 -
反转二叉树
我的简洁解答:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; *原创 2017-03-16 09:03:08 · 294 阅读 · 0 评论 -
leetcode-542-01 Matrix
关于广度优先搜索的问题。思路: 因为这道题是求值为1的点到值为0的区域的最短距离,因为是在图上求最短距离,所以可以用广度优先搜索方法求解,该方法在求最小生成树和迪杰斯特拉最短路径算法的思想中都有体现。本质上是有一个已知最优路线(最优一般指距离最短)区域,这个区域被放进queue中,这道题的这个区域就是0区域,所以一开始要将0区域都找出来,并把它们push进queue里,然后开始BFS,每遇到一个原创 2017-04-11 11:22:41 · 1517 阅读 · 0 评论 -
leetcode-101-Symmetric Tree
这是一个简单的递归题,当然,也可以通过栈实现递归的效果。思路: 我想说的是它的递归有点不同于常见的递归,常见的递归是每次传入一个节点,要么先序遍历,要么中序遍历,要么后续遍历,但这道题应该传入两个节点,因为它是要对称嘛,必须站在宏观的角度去看,遍历完所有节点才可以返回最终结果,到底是不是对称的。下面是我的C++代码跟一个递归代码:/** * Definition for a binary t原创 2017-04-12 09:44:53 · 467 阅读 · 0 评论 -
leetcode-321. Create Maximum Number-hard
题目链接:https://leetcode.com/problems/create-maximum-number/#/description这道题好难,我是看了discuss之后自己写出来的,用到了map存储, dp的思想,存储已经算出来的结果,以后用的时候没必要再算;还用到了贪心,具体体现在计算map和merge的函数中。本题思路:首先先从两个nums数组中分别计算从长度为i到k的最长数字组合,原创 2017-04-03 11:40:49 · 284 阅读 · 0 评论 -
leetcode-513. Find Bottom Left Tree Value
思路: 简单的递归。利用help函数,如果level大于当前最大level,说明它是该level一个最左的一个值 注意传入的是引用。其他思路: 还有一种方法是利用queue,从右往左往里push,思想是二叉树的层序遍历,只不过是从右向左,最后一个位置就是最后的结果。C++代码:/** * Definition for a binary tree node. * struct TreeN原创 2017-04-13 10:51:18 · 187 阅读 · 0 评论 -
leetcode-130. Surrounded Regions
这道题见鬼了,为什么我的代码中,dfs()函数里,注释掉的代码可以AC,但是现在的代码跑就是Runtime Error呢?class Solution {public: void dfs(vector<vector<char>> &board, int row, int clo) { int m=board.size(), n = board[0].size();原创 2017-04-14 10:37:33 · 247 阅读 · 0 评论 -
leetcode-139. Word Break
考察点:dp; 思路:dp总是那么难想。关键是要搞清楚dp【i】表示的是什么, 这里的dp【i】表示的就是问题:即s的前i个字符可以由set1内的字符串表示出来吗?方法是两个循环,外层是从s的第一个位置1到最后位置len;内层循环是遍历set1中的所有string,看第i个位置是否符合要求。 C++代码:class Solution {public: bool wordBreak(str原创 2017-04-30 11:15:03 · 322 阅读 · 0 评论 -
leetcode-472. Concatenated Words
考察点:dp,看是否一个string可以由其他string组成的变种; 思路:首先要会一个string可以由其他string组成这道题。然后就可以依次按照string的length长短来判断是否满足上一道字问题。注意一点的是再判断时在第二个for循环下j应该按照从0到i的遍历一次而不是按照string集合去遍历,因为那样会超时。C++ 代码:class Solution {public:原创 2017-04-30 12:17:45 · 1045 阅读 · 2 评论 -
leetcode-114. Flatten Binary Tree to Linked List
而叉树的先序遍历。 C++ 代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL)原创 2017-04-19 10:33:27 · 236 阅读 · 0 评论 -
leetcode-515. Find Largest Value in Each Tree Row
利用队列;代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * };原创 2017-04-15 13:51:46 · 192 阅读 · 0 评论 -
leetcode-547. Friend Circles
考察点:并查集; 出错点:第一次出错在union上,重名了第二次出错在在find函数中应该是i=UF【i】的,结果写反了,看来每一步代码都应该明确之后才能写出来。C++ 代码:class Solution {public: vector<int> UF; vector<int> size; int count; int find(int i){原创 2017-04-20 20:22:17 · 628 阅读 · 0 评论 -
leetcode-491. Increasing Subsequences
考察点:dfs; 思路:dfs,对于dfs函数,其中对每一个位置的数都选择选或者不选来判断。最后,用set,将set转化为vector的函数是copy(iter1, iter2, back_inserter(v1));C++代码:class Solution {public: vector<vector<int>> findSubsequences(vector<int>& nums)原创 2017-05-12 10:39:55 · 296 阅读 · 0 评论 -
leetcode-332-Reconstruct Itinerary
这道题考的是DFS、有向图、欧拉路径(一笔画问题)、Hierholzer’s 算法。思路:把问题抽象成一个图,求一笔画路径,还要保持最小序输出,所以应该用multiset存储一个起点的目的地。想到mapclass Solution {public: void dfs(string airport) { while (map1[airport].size()) {原创 2017-04-22 09:10:32 · 488 阅读 · 0 评论 -
leetcode-108. Convert Sorted Array to Binary Search Tree
思路:因为nums是有序对,所以每次将一个区间的中间位置的数插进去得到的二叉树是BST。bug free。C++ 代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNod原创 2017-04-22 16:46:18 · 234 阅读 · 0 评论 -
leetcode-494. Target Sum
考察dp,DFS; 思路:DFS简单,但是时间耗费多;DP算法中,dp[i][j]表示的是前i个数表示总数j的所有可能。运用数组下标映射算法。C++代码: DFS:class Solution {public: int ret; int findTargetSumWays(vector<int>& nums, int S) { ret = 0;原创 2017-04-23 12:03:01 · 407 阅读 · 0 评论 -
leetcode-329. Longest Increasing Path in a Matrix
考察点:dfs,dp,memory; 思路:遍历每个节点,用dp存储该节点的最长值;dfs函数返回该节点的最长值,dfs里,如果已经存储,就直接返回,否则就四个方向依次遍历,如果比它小就放弃这条路;最后得出结果就返回最大的。 C++代码:class Solution {public: vector<vector<int>> dirs={{0,1},{1,0},{0,-1},{-1,0}原创 2017-05-14 11:46:07 · 177 阅读 · 0 评论 -
leetcode-315. Count of Smaller Numbers After Self
这道题好难,考察树状数组。 思路:首先,先判断nums是否为0数组,若是做出相应选择;然后将nums转化为从1开始的数组,即整体平移,使其最小值为1;然后构造树状数组tree,tree【i】的含义要搞清楚:从tree【i】加到i去尾到0的tree【0】为,当前数字num位置后面的, 比num小的数的个数之和。然后每移动一次要更新一次tree。C++ 代码:class Solution {publ原创 2017-05-06 20:41:59 · 281 阅读 · 0 评论 -
leetcode-135. Candy
考察点贪心思路从左往右扫描一遍,贪心一次;然后从右往左扫描一遍,当当前位ratings小于左边一位ratings并且当前为nums大于左边一位nums时,要将左边一位赋值为当前位nums+1.C++代码class Solution {public: int candy(vector<int>& ratings) { int size = ratings.size();原创 2017-11-06 16:02:19 · 215 阅读 · 0 评论