leetCode
文章平均质量分 58
Lesley dude
信仰
展开
-
[LeetCode]Linked List Cycle II
解题思路:每经过一个node,把它的val置为INT_MIN,遍历,如果找到哪个node的val为INT_MIN,说明刚才来过,直接返回这个node /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int原创 2015-07-26 00:28:34 · 238 阅读 · 0 评论 -
[LeetCode]Gas Station
解题思路:1,假设每个city的净值为 gas[ i ] - cost[ j ];2,遍历所有gas station,carry为净值的和;3,中心思想,如果在某个station,carry的值是最小的,那么从下一个station开始绕一定是最好的策略。同时,如果carry总和 >= 0 一定可以绕一圈,否则不能够绕一圈返回-14,注意一点:下一个点要用 (minInd+1) %原创 2015-07-26 16:34:58 · 374 阅读 · 0 评论 -
[LeetCode]Single Number
解题思路:两个相同的数做 异或运算,结果肯定为零,那么以nums[0]为标的,其他所有的数都跟nums[0]做 ^ 运算,最后的结果就是那个只出现一次的 数字 class Solution {public: int singleNumber(vector& nums) { for (int i = 1; i < nums.size(); ++i){原创 2015-07-26 12:59:31 · 355 阅读 · 0 评论 -
[LeetCode]Kth Smallest Element in a BST
解题思路:二叉搜索树,如果采用中序遍历的话,可以得到 从小到大的 序列;如果用递归的方法,要保存一个数组,而题目中说二叉树经常的添加删除等操作,利用额外存储显然有些累赘;除了递归法,就是迭代法。用一个stack临时存储各个node,每次pop一个node,k就可以减去1,表示当前最小的已经找到。详情参考代码时间复杂度为logn的样子 /** * Definition原创 2015-07-26 00:13:42 · 312 阅读 · 0 评论 -
[LeetCode]Construct Binary Tree from Preorder and Inorder Traversal
解题思路:自己画一颗二叉树,把它的 先序遍历和 中序遍历写出来,然后可以发现规律。1,preorder的第一个元素a,是root的val;2,在inorder中找到a,则a左边的元素都在root的左子树上,inorder中a右边的元素都在root的右子树上;3,inorder中a左边的元素,紧接着出现在 preorder中a的后面并且连续,利用这个规律,可以 分治了4,我觉得看原创 2015-07-25 23:48:01 · 328 阅读 · 0 评论 -
[LeetCode]4Sum
解题思路:边界条件:如果nums的长度小于4,就不要玩啦整体思路类似 3Sum,这里要注意几个优化的地方;1,sort (与优化无关)2,4个指针,左右各两个;依次是left, i, j , right3,判断条件,如果sum 4,否则,j--(减到nums[j] != nums[j + 1]), i = left+1;其中,如果sum == target, 把此时的四原创 2015-07-26 14:12:58 · 364 阅读 · 0 评论 -
[LeetCode]Binary Tree Inorder Traversal
解题思路:1,中序遍历,就是要不断的把left node加入到 stack中;2,直到left为空,stack.top,这个一定是要马上加入返回数组的;3,然后把 其right node压栈4,结束条件:这个要细心,stack不为空是一个,但不是全部,另外一部分就是 当前指针不为NULL。据个例子,遍历到 root的时候,stack最后pop之后就是空了。但是当前指针指向 root原创 2015-07-26 18:23:34 · 285 阅读 · 0 评论 -
[LeetCode]Clone Graph
解题思路:1,要避免环带来的干扰,hash表没商量;2,但如果用unordered_set, 麻烦,应为对一个 original node,你只能通过label去判断是否已经克隆,这不能用set原有的 find方法。如果你set中存label,必然要有一个对应的存pointer的存储结构。3,所以,用unordered_map,从 originalGraph 映射到 cloneGrap原创 2015-07-26 17:57:14 · 314 阅读 · 0 评论 -
[LeetCode]Linked List Cycle
解题思路:题目的意思,就好像是在问,一个数组中,有没有重复的数字。因为 如果list中有环,那么必然存在两个指针指向同一个地址。 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x原创 2015-07-26 00:22:25 · 325 阅读 · 0 评论 -
[LeetCode]Word Break
解题思路:动态规划问题,DP[i] 表示是否在wordDict中找到一种组合使得 s中 0到 i 的substr被 space-separated.1,第一眼看到,就觉得一个for循环是不可能完成任务嗒,要两个for, 时间复杂度O(n2)2,设置两个指针 i (0~len-1), j(i+1~len),每次去substr[ i ~ j ]3,DP[ j -1 ] 设置为true的原创 2015-07-26 10:37:10 · 263 阅读 · 0 评论 -
[LeetCode]Letter Combinations of a Phone Number
解题思路:深度搜索,配合字典的使用。如果把组合看成一颗树,那么就是要从树根找到leaf,在leaf那里把string添加到要返回的vector里面。实现方面,主要注意 string.c_str() 的巧妙使用。以及最后加入到 结果集合的 str的长度已定要满足与digits长度一致(如果不注意,输入为空时,你会得到一个WA) class Solution {publi原创 2015-07-26 12:43:02 · 529 阅读 · 0 评论 -
[LeetCode]Construct Binary Tree from Inorder and Postorder Traversal
解题思路:分而治之,利用中序和后序遍历的特点 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL)原创 2015-07-26 18:57:00 · 341 阅读 · 0 评论 -
[LeetCode]Binary Tree Right Side View
解题思路:宽度搜索,记录每一个node的height,当遇到当前node的height与前一个node的height不一样时,说明前一个node是那个height level的最右边的node,可以把val加入return vector/** * Definition for a binary tree node. * struct TreeNode { *原创 2015-07-26 20:19:15 · 347 阅读 · 0 评论 -
[LeetCode]Basic Calculator II
解题思路:1,就是要写个简单的计算器呗2,先把所有的 space去掉, 实现nonSpace方法;3,把所有的 operator 和 operands分开,实现简单的 splitToOper 方法;4,第3步得到的序列,是算数表达式的中缀表达式,计算机不好懂,要转换成逆波兰表达式;实现RPExpression方法5,有了上述输入序列,这个题就变的跟 Evaluate Rev原创 2015-07-25 12:31:39 · 485 阅读 · 0 评论 -
[LeetCode]Sum Root to Leaf Numbers
解题思路:深度遍历,记录所有leaf节点对应的number string,最后再把 string to int,进行计算。 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * T原创 2015-07-26 22:22:36 · 376 阅读 · 0 评论 -
[LeetCode]Populating Next Right Pointers in Each Node
解题思路:宽度搜索。1,增加一个queue记录height;2,从queue出来的node,如果与前一个node的height一样,则让前一个node->next = curnode;3,每次循环,都更新preNode 和preHeight;/** * Definition for binary tree with next pointer. * struct Tr原创 2015-07-26 22:59:27 · 428 阅读 · 0 评论 -
[LeetCode]Best Time to Buy and Sell Stock II
解题思路:记录两个状态:1,当前,有股票时候的最大收益 havStock = max(havStock, nonStock - prices[i])2,当前,没有股票时候的最大收益 nonStock = max(nonStock, havStock + prices[i]) 状态转移公式已经列在上面了。class Solution {public: int m原创 2015-07-27 10:44:52 · 378 阅读 · 0 评论 -
[LeetCode]Best Time to Buy and Sell Stock
解题思路:记录两个状态1,当前最大收益maxprofit = max(maxprofit, prices[i] - minCost);2,以及当前最小花费 minCost = min ( minCost , prices[i] ) class Solution {public: int maxProfit(vector& prices) { if原创 2015-07-27 10:23:05 · 311 阅读 · 0 评论 -
[LeetCode]Generate Parentheses
解题思路:BackTracking。层层深入 class Solution {public: vector generateParenthesis(int n) { vector ret; search("", 0, n, ret); return ret; } void search(string str原创 2015-07-26 23:34:41 · 414 阅读 · 0 评论 -
[LeetCode]Number of Islands
解题思路:图的连通性,一次遍历并不能遍历所有的island,要在深度搜索外加一个for循环,并做好被explored的点的标记class Solution {public: int numIslands(vector>& grid) { if(grid.size() == 0 || grid[0].size() == 0) return 0;原创 2015-07-27 21:44:00 · 397 阅读 · 0 评论 -
[Leetcode]database 相关题目的总结
Combine Two Tableshttps://leetcode.com/problems/combine-two-tables/解题思路: 合并table Person 和Address,其中提示说不管Address里有没有personId,Person里的记录都要显示全部。这是典型的 left join 功能。select P.FirstName, P.LastNa原创 2015-08-23 00:53:30 · 3498 阅读 · 0 评论 -
[LeetCode]Path Sum II
太简单,不解释 # Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: # @para原创 2015-07-28 20:31:42 · 305 阅读 · 0 评论 -
[LeetCode]Two Sum
解题思路:1,暴力法,O(n^2) time O(1) space2,可以利用 hash表,把 数组中的值 映射到 index, 每遍历到一个数x,就看一下hash表中是否存在 target-x,如果存在, 就return了;不存在,就把x加入到 hash表中 public class Solution { public int[] twoSum(int[]原创 2015-08-11 08:18:27 · 333 阅读 · 0 评论 -
[LeetCode]Valid Palindrome
第二遍,解题思路:1,设定两个指针 i 和 j,分别指向s的开头和结尾,然后i 和 j相向而行,2,其间跳过非字符数字字符,3,比较大小时做一个大小写转换 public class Solution { public boolean isPalindrome(String s) { if (s.length() == 0) return true; // o原创 2015-08-11 08:37:31 · 352 阅读 · 0 评论 -
[LeetCode]Kth Largest Element in an Array
解题思路:1,借用快排分治的思想;2,递归函数中,每次随机选取一个数作为标的mark;3,把 比mark大的存入一个数组larger,比mark小的存入另外一个数组smaller4,结束条件就是,所找的第k大的数, k == larger.size() + 1 // C++ 实现class Solution {public: int findKthL原创 2015-07-29 23:24:59 · 385 阅读 · 0 评论 -
[LeetCode]Intersection of Two Linked Lists
思路:条件比较严:1,不破坏数据结构;2,时间复杂度O(n), 空间复杂度O(1)3,假设没有环路;4,没有交点,返回null反过来想,从链表的结尾开始,向链表header开始数,对同一个index对应的node,链表A和B的address在intersection之前都是相等的,在intersection之后开始不同。但题目所述链表非双向list,我们必须li原创 2015-07-18 22:41:15 · 336 阅读 · 0 评论 -
[LeetCode]Power of Two
解题思路:如果一个数是2的次方数,那么这个数的二进制表示中,只有最高位是1,其余都是0;那么,我们就可以统计二进制是1的个数n,cnt大于1则false,cnt==1则true1,先决条件:n>0, 如果n2,不变式:在循环中执行 cnt += n&1,n右移一位3,结束条件:n==04,临界条件:(n>0, 如果nclass Solution {publ原创 2015-07-18 22:57:24 · 306 阅读 · 0 评论 -
[LeetCode]Lowest Common Ancestor of a Binary Search Tree
思路:利用二分搜索树的性质,当找到一个node,满足 ( p->val - node->val ) * ( q->val - node->val ) 1,先决条件:p和q存在于BST上2,不变式:先判断是否满足结束条件,然后再通过比较决定 下一步进入左子树还是右子树(判断左右子树是否为空);3,结束条件:找到node满足 ( p->val - node->val ) * (原创 2015-07-18 22:59:15 · 343 阅读 · 0 评论 -
[LeetCode]Path Sum
思路:深度搜索(这里采用 回溯法)1,先决条件:找到树根2,不变式:遍历子node,传递sum和当前和 curSum3,结束条件:node没有子节点,判断sum 是否等于curSum4,临界条件:树为空很简单,一遍过。 /** * Definition for a binary tree node. * struct TreeNode {原创 2015-07-18 22:48:19 · 279 阅读 · 0 评论 -
[LeetCode]Palindrome Linked List
解题思路:1,单向链表就只能从前找到后,不能反向迭代。2,回文的特点,就是要从两边迭代到中间。3,综合上述两个特点,可以想到把链表后半部分翻转一下(题目没说不能破坏原有结构),然后从链表的开头和中间开始,比较对应node的value1,起始条件:lenList, curTail指向链表结尾,curMid指向链表中间,将链表后半部分翻转2,不变式:比较curHeader+原创 2015-07-18 23:01:16 · 364 阅读 · 0 评论 -
[LeetCode]Implement Queue using Stacks
解题思路:1,使用2个stack,一个叫PushStack,一个叫PopStack。2,每当Queue新进来一个element时,就把它加入到PushStack,3,当Queue执行Pop操作时,从PopStack取出element。4,当PopStack为空时,把PushStack的元素一个一个的加入到PopStack数据如何从pushStack到popStack原创 2015-07-19 08:59:06 · 348 阅读 · 0 评论 -
[LeetCode]Implement strStr()
对KMP算法的一个很好的说明:KMP算法详解 下面是对算法的实现,有几点需要留意:1,边界条件:needle的长度不能大于haystack2,前条件:计算next数组,next的index代表字符串的长度;p 为haystack索引,q为needle索引。3,循环结束条件,haystack和needle有一个遍历结束;4,不变式:如果haystack[p] == nee原创 2015-07-22 21:24:13 · 304 阅读 · 0 评论 -
[LeetCode]Summary Ranges
解题思路:1,凡是数组nums中元素elem 减去前一个元素 pre的结果不为1的,都是一个range的开始;2,通过一次遍历,用一个hash表把这些range的开始index记录下来,最后加上vector.size()作为结束3,hash表中的没两个元素,都是nums中一个range的起始位,通过一次遍历,很容易得到想要的结果边界条件:vector为空,或者vector长原创 2015-07-19 09:45:58 · 1058 阅读 · 0 评论 -
[LeetCode]Reverse Words in a String
解题思路:1,把首尾的 space都去掉2,两个指针start和it分别指向word的开始和结束的下一位;3,isPreWord用于指示前一个char是字母还是 空格(这是为了过滤两个单词中间有多个space的情况)4,每发现一个新的完整的单词,就插入到ret的开头,接着插入一个 space5,因为while循环中我们是以space作为发现单词的标志,而语句的结尾没有space原创 2015-07-24 21:37:23 · 358 阅读 · 0 评论 -
[LeetCode]Invert Binary Tree
解题思路:递归法,只要root有一个子树不为空,就要swap一次,然后深入到子树中执行相同的操作前条件:存在一个root不变式:swap左右子树,递归结束条件:root左右子树都为NULL临界条件:root为NULL// 编译错误Line 23: return-statement with a value, in function returning '原创 2015-07-19 10:03:39 · 508 阅读 · 0 评论 -
[LeetCode]Implement Stack using Queues
解题思路:1,跟Implement Queue using Stacks这道题类似;2,用两个Queue,一个叫Queue1,一个叫Queue2。3,对于top或者pop操作,把当前存数据的那个Q1前n-1个elem都转移到另外一个Q2,只剩下最后一个elem,也就是最新push进的。4,对于push来说,如果Q1和Q2都为空,那么随便找一个添加elem。然后,必须保证Q1和Q2至原创 2015-07-19 11:42:41 · 355 阅读 · 0 评论 -
[LeetCode]Rectangle Area
解题思路:1,最主要是找到 交集的面积2,把2维的问题拆分成2个1维的问题3,对于直线上的问题,求线段AB和线段CD的交集的长度,存在四种情况 a,C在AB上,D在AB右边; b,CD在AB里面 c,D在AB上,而C在AB左边; d,AB在CD里面; 写一个方法做上述判断,可以很快求出两个矩形交集的height和width原创 2015-07-19 12:29:05 · 372 阅读 · 0 评论 -
[LeetCode]Contains Duplicate II
解题思路:用 unordered_map构建逆向hash表,所以逆向,就是指把index当成value,把value当成index。这样,当value第二次出现时,可以在hash表中找到上次出现的index。比较这两个index的diff。即可得到答案。这里有个贪心的思想,就是相邻的两个相等数的index的diff一定比不相邻的小!前条件:unordered_map , 不原创 2015-07-19 15:21:58 · 367 阅读 · 0 评论 -
[LeetCode]Isomorphic Strings
解题思路:1,哈希表,字符串s 和 t 一一对应,令字符串s的字符为 key,遍历s,如果s不存在于hash表中,插入,并领其value为t对应位置的字符;如果s中某字符存在于hash表中,并且其value与t中对应位置的字符不同,则返回false,否则返回true;2,上述过程要有个逆向的过程,即另建一个hash表,t的字符作为key,s的字符作为value,执行上述相同的逻辑原创 2015-07-19 22:38:26 · 263 阅读 · 0 评论 -
[LeetCode]Reverse Linked List
解题思路:A linked list can be reversed either iteratively or recursively. Could you implement both?方法一,迭代法:边界条件:head == NULL前条件:temphead = head, p = tail, q = tail->next不变式:head = head->原创 2015-07-19 15:41:21 · 198 阅读 · 0 评论