Leetcode
JANESTAR
细节决定成败,付出决定收获
展开
-
leetcode Course Schedule
提示中说了关键点在于求图中是否存在环的问题,典型的拓扑排序。有关拓扑排序的问题可以参考这篇文章点击打开链接 。图的数据结构有邻接表和邻接矩阵,选择邻接表可以很好的表明结点之间的依赖关系。判断图是否可以拓扑排序,我们可以每次找到入度为0的结点,然后删除与该结点连接的边,也就是相邻节点的入度减1,直到所有结点遍历完成。如果不存在入度为0的结点(存在环路),则返回false.class原创 2015-10-04 15:15:52 · 626 阅读 · 0 评论 -
Combination Sum II
解题思路:回溯法如何避免重复。如果两个数相同,我们先用前一个数,只有当前一个数用了,这个数才能使用。例如:1 1。当我们要使用第二个1时,我们要检查他的前面一个1是否使用了,当未被使用时第二个1就不能使用。class Solution {public: void compute_sum(vector>& result,vector flag,vector原创 2016-06-16 22:41:25 · 365 阅读 · 0 评论 -
关于Validate Binary Search Tree的总结
关于Validate Binary Search Tree的总结1,BST的定义:1) 左子树的所有值都比根节点小;2) 右子树的所有值都比根节点大;3) 左右子树也必须满足上面两个条件。需要注意的是,左子树的所有节点都要比根节点小,而非只是其左孩子比其小,右子树同样。根据BST定义来写递归程序。因为需要每个节点为根节点分别遍历其左右子树。假设一共有原创 2016-07-15 10:39:53 · 548 阅读 · 0 评论 -
Divide Two Integers
解题思路:使用位操作class Solution {public: int divide(int dividend, int divisor) { if(divisor == 1) return dividend; if(dividend == INT_MIN && abs(divisor) == 1) retur原创 2016-06-18 16:02:51 · 386 阅读 · 0 评论 -
Recover Binary Search Tree
解题思路:中序遍历。BST中存在一对被交换的元素,那么可以肯定,较大节点被交换到较小的那颗子树,较小节点被交换到较大的那颗子树了。那么会存在前一个节点大于当前节点的情况,第一次找到的这种情况,那么前一个节点就是第一个我们要找的节点。后面再出现这种情况的话,那么当前结点就是我们要找的第二个节点。最后再交互二个节点的值就好了。递归/** * Definition for a binary t原创 2016-07-15 13:11:25 · 499 阅读 · 0 评论 -
Copy List with Random Pointer
解题思路:使用map存储原来链表和新链表的节点之间的映射关系。/** * Definition for singly-linked list with a random pointer. * struct RandomListNode { * int label; * RandomListNode *next, *random; * RandomLis原创 2016-06-18 21:24:11 · 467 阅读 · 0 评论 -
Kth Smallest Element in a BST
解题思路:中序遍历,计数统计第K个值/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NUL原创 2016-06-19 15:25:26 · 432 阅读 · 0 评论 -
Swap Nodes in Pairs
解题思路:在纸上画图理解/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: L原创 2016-06-21 16:10:15 · 362 阅读 · 0 评论 -
328. Odd Even Linked List
解题思路:画图分析/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: L原创 2016-06-21 16:53:00 · 360 阅读 · 0 评论 -
Next Permutation
原理简介:1,从数组尾端开始遍历,找到第一个nums[i]2,要求下一个子序列,那么我们需要在1中得到的单调子数组中找到一个比nums[i]大的数字,并且要尽量小。这样才能保证是下一个子序列。由于子数组是单调递减的,那么我们从数组尾端开始找到第一个比nums[i]大的,那么这个数字就是满足我们要求的数字。将其与nums[i]交换3,交换之后,大于i组成的子数组仍然是递减的。所以我们只需原创 2016-08-16 17:36:49 · 737 阅读 · 0 评论 -
71. Simplify Path
思路:利用vector模拟栈技巧:利用getline实现字符串切分解法1:leetcode上别人的代码string simplifyPath(string path) { string res, tmp; vector stk; stringstream ss(path); while(getline(ss,tmp,'/')) {原创 2016-07-22 09:10:06 · 410 阅读 · 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 · 732 阅读 · 0 评论 -
282. Expression Add Operators
解题思路:深搜遍历所有可能的情况,终止条件为表达式计算的结果等于target。注意,这里要使用long 类型保存整数,否则会溢出。我在vs2013,win32模式下使用long同样不能通过"3456237490", 9191 -> []这个案例,改用long long 才可以。具体解析可以参考文末的这篇文章,讲的很好,主要要注意乘法情况下如何计算表达式的值。class原创 2016-08-08 19:08:53 · 718 阅读 · 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 · 1177 阅读 · 0 评论 -
142. Linked List Cycle II
解法一:如果链表中环 有n个结点,指针P1在链表上向前移动n步,然后两个指针以相同的速度向前移动。 当第二个指针指向环的入口结点时,第一个指针已经围绕着环走了一圈又回到了入口结点。所以首先要得到环中结点的数目。/** * Definition for singly-linked list. * struct ListNode { * int val; *原创 2016-08-10 16:00:13 · 891 阅读 · 0 评论 -
283. Move Zeroes
简单题:解题思路:1,插入排序(O(n))class Solution {public: void moveZeroes(vector& nums) { int size = nums.size(); int index=0; for(int i=0;i<size;i++) { if(nums[i]!=0) nums[index++]=n原创 2016-08-10 16:51:17 · 622 阅读 · 0 评论 -
Combination Sum
解题思路:回溯法class Solution {public: void do_sum(vector>& result, int cur,int level, int target, vector& candidates, vector& tmp){ if (cur == target) { result.push_back(tmp); return; } if原创 2016-06-16 21:12:07 · 360 阅读 · 0 评论 -
44. Wildcard Matching
Implement wildcard pattern matching with support for '?' and '*'.'?' Matches any single character.'*' Matches any sequence of characters (including the empty sequence).The matching should cover原创 2016-07-14 13:12:42 · 387 阅读 · 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 · 455 阅读 · 0 评论 -
Course Schedule II
原理与点击打开链接一样,拓扑排序法遍历即可,用vector保存每一个入度为0的结点。class Solution {public: vector findOrder(int numCourses, vector>& prerequisites) { vector> set; vector vec; for(int i=0;i<numCourses;原创 2015-10-05 15:02:36 · 477 阅读 · 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 · 557 阅读 · 0 评论 -
Binary Tree Zigzag Level Order Traversal
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */clas原创 2015-10-08 18:59:12 · 334 阅读 · 0 评论 -
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 · 568 阅读 · 0 评论 -
Combination Sum III
class Solution {public: int sum(vector t){ int cnt = 0; for(int i=0;i<t.size();i++) cnt+=t[i]; return cnt; } void dfs(int level,int target,vector& a原创 2015-10-22 21:30:52 · 457 阅读 · 0 评论 -
Combination Sum II
class Solution {public: int sum(vector s){ int cnt = 0; for(int i=0;i<s.size();i++){ cnt+=s[i]; } return cnt; } void dfs(int leve原创 2015-10-22 20:54:49 · 456 阅读 · 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 · 2646 阅读 · 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 · 637 阅读 · 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 · 2019 阅读 · 0 评论 -
Summary Ranges
简单题,知识点:std标准库中to_string(int)可以方便的将int 转换为string ,从而不再需要stringstream来做转换了。class Solution {public: vector summaryRanges(vector& nums) { int size = nums.size(); int i=0,j=0;原创 2015-10-31 13:38:44 · 484 阅读 · 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 · 548 阅读 · 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 · 511 阅读 · 0 评论 -
N-Queens II
N 皇后问题。典型的回溯解法。通过维持一个全局数组来记录当前尝试的皇后所在的列和两个对角线是否已经存在其他皇后。注意主对角线标识y-x可能为负,存取时需要加上n.我们可以通过坐标(x,y)的值来表示对角线。x+y的值标识副对角线,y-x的值标识主对角线。class Solution {public: void search(int cur,int n,vector>&原创 2016-06-15 20:49:47 · 417 阅读 · 0 评论 -
Permutations II
class Solution {public: vector> result; void search(vector& nums,vector flag,vector& vec){ if(vec.size()==nums.size()) { result.push_back(vec);原创 2016-06-16 17:06:30 · 468 阅读 · 0 评论 -
Leetcode-Serialize and Deserialize Binary Tree
解题思路:利用先序遍历递归遍历二叉树,对于空节点也将其作为一个节点看待,这样序列化的二叉树可以看成是一个完全二叉树。反序列化的时候,递归解析字符串,根据 根节点--左子树--右子树的规则构造二叉树。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeN原创 2016-09-01 16:13:50 · 793 阅读 · 0 评论