
算法
leagalhigh
never give up!
展开
-
leetcode-101-Symmetric Tree
这是一个简单的递归题,当然,也可以通过栈实现递归的效果。思路: 我想说的是它的递归有点不同于常见的递归,常见的递归是每次传入一个节点,要么先序遍历,要么中序遍历,要么后续遍历,但这道题应该传入两个节点,因为它是要对称嘛,必须站在宏观的角度去看,遍历完所有节点才可以返回最终结果,到底是不是对称的。下面是我的C++代码跟一个递归代码:/** * Definition for a binary t原创 2017-04-12 09:44:53 · 485 阅读 · 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 · 250 阅读 · 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 · 419 阅读 · 0 评论 -
leetcode-93. Restore IP Addresses
考察点:回溯; 思路:简单的回溯,就是考虑的条件要多点:s是否为空,s长度不能太长,还要正好4个点分(由time计数),开头是0直接返回等等;坑比较多。class Solution {public: vector<string> restoreIpAddresses(string s) { vector<string> ret; if (s == "" |原创 2017-05-14 10:13:28 · 169 阅读 · 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 · 190 阅读 · 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 · 295 阅读 · 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 · 937 阅读 · 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 · 317 阅读 · 0 评论 -
leetcode-523. Continuous Subarray Sum
考察hash、dp。 思路:用一个map记录,key是从开始0到i的和对k的余数,value是对应的i,及余数为key的情况下的下标值,若两个下标的余数相等,并且它们的下标差大于1的话,说明( ]区间内的连续和是k的倍数。这里的代码的map1[0]=-1用的很巧妙,若有两个数[5,7],这样可以使1-(-1)>1,返回true。 C++代码:class Solution {public:原创 2017-04-26 15:40:19 · 804 阅读 · 0 评论 -
leetcode-338. Counting Bits
考察点:dp,bit运算&; 思路:重点是理解i&(i-1)是将数字 i 的二进制格式下最右边的1转换成0;dp[i]的含义是数字i的1bit数目,因此dp[i] = dp[i&(i-1)] + 1;就好理解了。 C++代码:class Solution {public: vector<int> countBits(int num) { vector<int> ret(原创 2017-04-26 16:23:14 · 214 阅读 · 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 · 190 阅读 · 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 · 496 阅读 · 0 评论 -
leetcode-541. Reverse String II
考察点:string,边界脚码; 思路:这道题思路简单,关键是要bug free。尤其是在reverse函数里的边界判断时,应该先拿0这样的特殊边界条件测试一下,看是否正确,这样往往能够增加代码的正确率。 C++ 代码:class Solution {public: string reverseStr(string s, int k) { if (k == 0)原创 2017-05-04 09:50:21 · 320 阅读 · 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 · 302 阅读 · 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 · 205 阅读 · 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 · 257 阅读 · 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 · 342 阅读 · 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 · 1074 阅读 · 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 · 247 阅读 · 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 · 198 阅读 · 0 评论 -
leetcode-241. Different Ways to Add Parentheses
考察点:递归,分治。 思路:这道题是典型的递归,分治题目。首先应该明确主函数是什么作用:它接受一个string,返回由这个string组成的所有种计算结果vector。因此,可以遍历一遍字符串,找出运算符将字符串分成两个字符串,然后分别用该函数递归。然后将结果存入ret数组里。在for循环外,如果ret是空的,说明该字符串就是一个完整的数字,直接返回它的整数化结果就行。这也是最终判断条件在函数最后原创 2017-05-01 10:44:25 · 270 阅读 · 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 · 644 阅读 · 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 · 307 阅读 · 0 评论 -
leetcode-516. Longest Palindromic Subsequence
考察思想:回文串、dp、边界条件特判;思路:dp【j】【i】表示下标j到i的最长字串; i下标从左往右遍历, j下标从i-1往0遍历,通过判断s【j】和s【i】的字符是否相等做出对dp【j】【i】的不同赋值。最终返回的dp【0】【len-1】即为最终结果。 C++ 代码:class Solution {public: int longestPalindromeSubseq(stri原创 2017-04-27 09:58:33 · 336 阅读 · 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 · 188 阅读 · 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 · 422 阅读 · 0 评论 -
leetcode-450.delete a node in a BST
考察点:二叉树 思路:递归删除,有两种删法;C++ 代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL),原创 2017-09-27 14:30:12 · 163 阅读 · 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 · 316 阅读 · 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 · 221 阅读 · 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 · 225 阅读 · 0 评论 -
504 base 7
C++ 代码: 取余数运算;class Solution {public: string convertToBase7(int num) { if (num == 0) { return "0"; } stack<int> sta; int flag = 1; if (num < 0)原创 2017-10-01 10:21:19 · 193 阅读 · 0 评论 -
Add to List 316. Remove Duplicate Letters
考察点:递归,C++字符串操作,贪心; 思路:每一次递归,首先用贪心法找到left_most位置的字符,就是找到字母数尽可能最小的位置(‘a’的话最好),遇到只有一个字母的位置时停下扫描,break;然后将s的left_most位置之前的字符删掉,后面重复的字符也删掉,最后返回空字符或者left_most位置的字符加下一个递归的结果。C++代码:class Solution {public:原创 2017-10-01 16:41:46 · 176 阅读 · 0 评论 -
leetcode-394. Decode String
考察点:栈的使用,解析字符串 思路:使用两个栈:一个数字栈,一个string栈;数字栈栈顶表示string栈栈顶string的重复次数。从头到尾遍历string,遇到数字要提取数字,并压入数字栈,遇到 ‘[’要压入string栈空的string,遇到字母要将string栈栈顶的string拼接这个字母然后压栈,遇到‘]’要将string栈和num栈出栈重新拼接新的string入栈。最后在循环外要将原创 2017-10-06 13:11:17 · 228 阅读 · 0 评论 -
leetcode-606. Construct String from Binary Tree
考察点:递归,二叉树; 思路:注意初始情况就行。 C++代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL原创 2017-10-12 10:29:38 · 175 阅读 · 0 评论 -
leetcode- Add to List 669. Trim a Binary Search Tree
考察点:二叉树, 递归; 思路:如果root的val比L还要小,就应该trim掉root左边的枝,所以返回对root右边的递归;如果root的val比R还要大,返回对root左边的递归;如果root的val在[L, R]中间, 就分别对root的left和right赋值。这个思想很巧妙,不好想。 C++代码:/** * Definition for a binary tree node. *原创 2017-10-13 15:14:18 · 278 阅读 · 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 · 229 阅读 · 0 评论 -
leetcode- Add to List 458. Poor Pigs
考察点:信息论 思路:代码中,n是趟数,result是维度,逐渐增加维度看是否能测出的结构是否大于等于需要的结果。C++:class Solution {public: int poorPigs(int buckets, int minutesToDie, int minutesToTest) { if (buckets == 1) return原创 2017-09-26 14:00:40 · 276 阅读 · 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 · 179 阅读 · 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 · 374 阅读 · 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 · 366 阅读 · 0 评论