总结经典数据结构与算法(LeetCode)
文章平均质量分 69
LeetCode经典算法总结,总结了一些比较好的思路
JANESTAR
细节决定成败,付出决定收获
展开
-
Leetcode-Serialize and Deserialize Binary Tree
解题思路:利用先序遍历递归遍历二叉树,对于空节点也将其作为一个节点看待,这样序列化的二叉树可以看成是一个完全二叉树。反序列化的时候,递归解析字符串,根据 根节点--左子树--右子树的规则构造二叉树。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeN原创 2016-09-01 16:13:50 · 780 阅读 · 0 评论 -
375. Guess Number Higher or Lower II
We are playing the Guess Game. The game is as follows:I pick a number from 1 to n. You have to guess which number I picked.Every time you guess wrong, I'll tell you whether the number I pi原创 2016-08-30 10:09:54 · 917 阅读 · 0 评论 -
Count Numbers with Unique Digits
解题思路一:找规律,动态规划。f(n):长度为n的数字中包含的独立数位的数字个数。f(1) = 10 (0,1,2,3,4,...9)f(2)=9*9 ,因为十位只能是(1,2,...9),对于十位的每个数,个位只能取其余的9个数字。f(3)=f(2)*8=9*9*8f(10)=9*9*8*7...*1f(11)=0=f(12)=f(13)....class So原创 2016-08-17 11:16:12 · 714 阅读 · 0 评论 -
Next Permutation
原理简介:1,从数组尾端开始遍历,找到第一个nums[i]2,要求下一个子序列,那么我们需要在1中得到的单调子数组中找到一个比nums[i]大的数字,并且要尽量小。这样才能保证是下一个子序列。由于子数组是单调递减的,那么我们从数组尾端开始找到第一个比nums[i]大的,那么这个数字就是满足我们要求的数字。将其与nums[i]交换3,交换之后,大于i组成的子数组仍然是递减的。所以我们只需原创 2016-08-16 17:36:49 · 726 阅读 · 0 评论 -
142. Linked List Cycle II
解法一:如果链表中环 有n个结点,指针P1在链表上向前移动n步,然后两个指针以相同的速度向前移动。 当第二个指针指向环的入口结点时,第一个指针已经围绕着环走了一圈又回到了入口结点。所以首先要得到环中结点的数目。/** * Definition for singly-linked list. * struct ListNode { * int val; *原创 2016-08-10 16:00:13 · 875 阅读 · 0 评论 -
377. Combination Sum IV
解题思路:该题对时间有要求,我们使用之前用过的回溯法将会超时。因为回溯法遍历所有种可能,类似于穷举,时间效率肯定不高。换个思路,我们采用动态规划的思想来看看。动态规划状态方程:dp[target]=sum(dp[target-nums[i]]) (for i=0..num.size()-1)dp[target] 代表一共有多少种可能。那么从target-nums[i] 变为原创 2016-08-09 15:47:10 · 1162 阅读 · 0 评论 -
282. Expression Add Operators
解题思路:深搜遍历所有可能的情况,终止条件为表达式计算的结果等于target。注意,这里要使用long 类型保存整数,否则会溢出。我在vs2013,win32模式下使用long同样不能通过"3456237490", 9191 -> []这个案例,改用long long 才可以。具体解析可以参考文末的这篇文章,讲的很好,主要要注意乘法情况下如何计算表达式的值。class原创 2016-08-08 19:08:53 · 705 阅读 · 0 评论 -
166. Fraction to Recurring Decimal
今天华为出了这么一道面试题,当时我一紧张,没写出来。。。关键是记录循环小数,采用map结构。注意leetcode上这道题要防止溢出。将int 转换为long。一般来说int为4个字节,如果long也为4个字节的话,这样转换还是不成功的,由此我推断leetcode系统的编译器应该是64位的,这样long是8个字节,这样就避免了溢出。class Solution {public:原创 2016-06-24 14:29:25 · 408 阅读 · 0 评论 -
链表中倒数第K个节点
解决思路:遍历一遍,获取链表长度,然后再遍历一遍,找到第len-k个节点即为倒数第K个节点/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution原创 2016-06-12 12:57:12 · 606 阅读 · 0 评论 -
1068. Find More Coins (30)
题意:给定不同面额的硬币若干个,要求找出一个硬币序列Vi满足V1 <= V2 <= ... k such that V1 + V2 + ... + Vk = M.分析:此题有些类似我们之前讲过的01背包问题。若找出满足题意得多个序列,选择最小的序列。我们设F(n,m)为前n个硬币所能获得的最大的(但不大于m)的硬币数额之和。若给定的N,M情况下,有F(N,M)==M,则原创 2015-03-15 23:54:06 · 2494 阅读 · 2 评论 -
Perfect Squares
题解:求平方和等于n的数的最小个数思路:动态规划解决状态转移方程:dp[i+j*j]==min(dp[i+j*j],dp[i]+1);class Solution {public: int numSquares(int n) { vector num(n+1,INT_MAX); for(int i=1;i*i<=n;i++){原创 2015-10-08 19:57:40 · 558 阅读 · 0 评论 -
Sum Root to Leaf Numbers
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; *///非递归原创 2015-09-23 20:57:26 · 494 阅读 · 0 评论 -
【leetcode】290. Word Pattern
解题思路:使用两个map结构,注意要防止abba dog dog dog dog 的情形,所以需要两个Mapclass Solution {public: bool wordPattern(string pattern, string str) { unordered_map map; unordered_map map2; vector vec; int j=0; f原创 2015-10-09 00:15:21 · 2616 阅读 · 0 评论 -
Leetcode Clone Graph
//用BFS遍历图所有结点,使用unordered_map结果存储已经构造的结点,queue存放还没有访问的结点。/** * Definition for undirected graph. * struct UndirectedGraphNode { * int label; * vector neighbors; * UndirectedGraphNode原创 2015-10-04 13:25:09 · 443 阅读 · 0 评论 -
leetcode Course Schedule
提示中说了关键点在于求图中是否存在环的问题,典型的拓扑排序。有关拓扑排序的问题可以参考这篇文章点击打开链接 。图的数据结构有邻接表和邻接矩阵,选择邻接表可以很好的表明结点之间的依赖关系。判断图是否可以拓扑排序,我们可以每次找到入度为0的结点,然后删除与该结点连接的边,也就是相邻节点的入度减1,直到所有结点遍历完成。如果不存在入度为0的结点(存在环路),则返回false.class原创 2015-10-04 15:15:52 · 596 阅读 · 0 评论 -
【Lintcode|leetcode】245 Subtree
/** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * TreeNode(int val) { * this->val = val; * this->left = this->right =原创 2015-09-23 00:01:53 · 1998 阅读 · 0 评论 -
Unique Paths II
//动态规划方程: res[j]+=res[j-1]class Solution {public: int uniquePathsWithObstacles(vector>& obstacleGrid) { if(obstacleGrid.size()==0||obstacleGrid[0].size()==0) return 0;原创 2015-10-11 13:53:32 · 617 阅读 · 0 评论 -
Majority Element
class Solution {public: int majorityElement(vector& nums) { unordered_map map; for(int i=0;i<nums.size();i++){ map[nums[i]]++; } for(auto& x:map){原创 2015-10-22 21:46:48 · 543 阅读 · 0 评论 -
Different Ways to Add Parentheses
解题思路:分治法,使用Map 避免重复计算class Solution {public: map> mp; //使用map避免递归过程中重复计算 vector diffWaysToCompute(string input) { if(mp.find(input)!=mp.end()) return mp[input]; i原创 2016-05-29 12:47:38 · 499 阅读 · 0 评论 -
215. Kth Largest Element in an Array
题意,求数组中的第K大的数。思路1:利用快速排序的思路,找到一个下标为n-K的下标index,前面从下标0至n-K-1的数均小于index,该下标的值即为第K大的数字思路2:利用堆或者红黑树来解答。维护一个容量为K的容器,建立一个小根堆,遍历数组一遍,如果遍历的元素的值比堆顶元素值要大,则移除堆顶的元素,插入遍历的元素。最后得到的堆顶元素即为所求的第K大的元素。 由于multiset是基于原创 2016-05-28 21:20:46 · 533 阅读 · 0 评论 -
二叉树遍历总结
二叉树遍历总结1,前序遍历递归与非递归解法1.1 前序遍历递归写法/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : va原创 2016-04-08 14:07:13 · 1233 阅读 · 0 评论 -
Recover Binary Search Tree
解题思路:中序遍历。BST中存在一对被交换的元素,那么可以肯定,较大节点被交换到较小的那颗子树,较小节点被交换到较大的那颗子树了。那么会存在前一个节点大于当前节点的情况,第一次找到的这种情况,那么前一个节点就是第一个我们要找的节点。后面再出现这种情况的话,那么当前结点就是我们要找的第二个节点。最后再交互二个节点的值就好了。递归/** * Definition for a binary t原创 2016-07-15 13:11:25 · 490 阅读 · 0 评论