leetcode
文章平均质量分 60
silenci
宅若久时天然呆,呆到长时自然萌
展开
-
"same tree" and "Delete Node in a Linked List"
same tree:/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(N原创 2016-05-25 11:17:34 · 225 阅读 · 0 评论 -
Contains Duplicate
class Solution {public: bool containsDuplicate(vector& nums) { map temp; for (int i = 0; i<nums.size(); i++) { if(temp.count(nums.at(i))){ return true;原创 2016-05-26 18:35:47 · 205 阅读 · 0 评论 -
Lowest Common Ancestor of a Binary Search Tree
情况一:节点只有左、右指针,root已知思路:一开始想到用递归去做,但是因为本来对递归的概念还很模糊,所以在设计递归出口的时候一点思路也没有,翻了关于递归的资料,找到一张图能很好地解释递归:递归有两个出口,一是没有找到a或者b,则返回NULL;二是只要碰到a或者b,就立刻返回,这样的话下面的代码就很好理解了。[cpp] view plain copy原创 2016-05-28 10:02:44 · 193 阅读 · 0 评论 -
"Happy Number" and "Climbing Stairs"
Happy Number: 将结果先存在一个数据结构里,算出新的结果后,去数据结构里查找有没有重复的数据,以此来避免陷入无限的循环。Climbing Stairs:给定一个数n,有两种途径到达n一,从n-1处,爬一阶楼梯到达n二,从n-2处,爬两阶楼梯到达n这符合动态规划的思想,爬楼梯的步数是一组斐波那契数。原创 2016-05-29 08:57:54 · 182 阅读 · 0 评论 -
Swap Nodes in Pairs
struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; class Solution { public: ListNode *swapPairs(ListNode *head) { Lis转载 2016-05-30 11:05:08 · 205 阅读 · 0 评论 -
Best Time to Buy and Sell Stock
这是求最大子数组的问题,编码不难,有穷举、分治、动态规划三种方法。引起我兴趣的是分治的子问题划分和动态规划的最优子结构的证明。分治:从数组的中间分开,最大子数组出现的三种情况:1、在左半部分2、在右半部分3、跨越中点(求跨越中点的子数组等价于求从中间元素开始往左累加的最大值 + 从中间元素开始往右累加的最大值)动态规划:对于所有数组元素进行划分,如果加上原创 2016-05-31 10:18:53 · 257 阅读 · 0 评论 -
"Binary Tree Level Order Traversal" and "Balanced Binary Tree"
这两道题刚好分别是广度优先搜索和深度优先搜索,拿出来对比学习一下。Binary Tree Level Order Traversal:queue _1_q; vector> ovec; vector ivec; TreeNode *temp = root; if (!temp) return ovec; _1_q.push(temp); while (!_1_q原创 2016-06-01 14:26:14 · 186 阅读 · 0 评论 -
"Symmetric Tree" and "Remove Element"
Symmetric Tree://一开始用了中序遍历树,检查输出数组是否对称的方法,上传代码后juage错误。class Solution {public: vector temp; bool isSymmetric(TreeNode* root) { if (root == NULL) return true; middle_order(root); auto _原创 2016-06-02 10:14:50 · 160 阅读 · 0 评论 -
"Contains Duplicate II" and "Merge Sorted Array"
Contains Duplicate II:一开始想的还是线性查找(囧),试了下超时(时间复杂度O(N^2))。看到网上说用一个大小为K的框去依次check整个数列,还是超时(时间复杂度O(N))。最后还是得祭出map,还是O(logN)查的快(囧)。主要是学到了新的map写法,以前都是用insert之类的方法,原来还可以用近似数组的方法使用map啊。class Solution {pu原创 2016-06-07 16:33:40 · 253 阅读 · 0 评论 -
"Isomorphic Strings" and "Bulls and Cows"
这两道题都是关于元素映射关系的,第一次看的时候头好疼,渐渐能把映射关系抽象出来就好了。Isomorphic Strings:建立map存储映射关系,如果不符合关系就返回false,需要翻转映射对象再检测一次,总共检测两次。class Solution {public: bool isIsomorphic(string s, string t) { if (原创 2016-06-08 10:13:11 · 179 阅读 · 0 评论 -
Count Numbers with Unique Digits
最后要加上countNumbersWithUniqueDigits(n-1)class Solution {public: int countNumbersWithUniqueDigits(int n) { if(n==0) return 1; if(n==1) return 10; i原创 2016-06-25 08:55:17 · 224 阅读 · 0 评论 -
"Factorial Trailing Zeroes" and "Pascal's Triangle II"
Factorial Trailing Zeroes:找从1到n之间所有数包含多少个约数5.class Solution {public: int trailingZeroes(int n) { int res = 0; while(n) { res += n/5; n原创 2016-06-05 09:48:50 · 146 阅读 · 0 评论 -
Word Pattern
Word Pattern:和之前的一篇博文一样,这道题主要是找双向映射关系,映射关系不对的就返回false。做这道题的时候在处理空格分隔的字符串上浪费了很多时间,在网上找到了一种很好地处理方法。(PS,处理字符串的循环用size()和i去遍历效果比迭代器遍历好一些)class Solution {public: bool wordPattern(string pattern, s原创 2016-06-10 10:47:13 · 247 阅读 · 0 评论 -
Reverse Bits
class Solution {public: uint32_t reverseBits(uint32_t n) { uint32_t m=0; for(int i=0;i<32;i++){ m<<=1; m = m|(n&1); n>>=1; } re原创 2016-06-11 11:08:56 · 141 阅读 · 0 评论 -
Missing Number
排序然后扫一遍AC了:class Solution {public: int missingNumber(vector& nums) { sort(nums.begin(),nums.end()); int tmp = 0; int cnt = 0; while(tmp==nums[cnt])原创 2016-06-27 08:49:43 · 143 阅读 · 0 评论 -
Binary Tree Paths
Binary Tree Paths:看到这道题,首先想到了深度优先搜索和广度优先搜索,深度优先搜索只需要两个迭代,写起来简单,就选了深度优先。然后写了一份代码,思路是搜到叶子节点后在返回的过程中搜集路径信息,并存到一个map里。但是路径path作为map的键值被存储和检索,不能被修改,或者说修改起来很麻烦,下面贴我的代码,注意这份代码是错的,不能通过编译!class Solution {原创 2016-06-12 10:45:51 · 162 阅读 · 0 评论 -
"Palindrome Linked List" and "Longest Common Prefix"
Palindrome Linked List:O(n)时间复杂度和O(1)空间复杂度,所以要翻转链表(一开始没想到),翻转连边用了迭代法。class Solution {public: bool isPalindrome(ListNode* head) { if (!head || !head->next) { return true; } ListNode * sl原创 2016-06-13 09:29:34 · 297 阅读 · 0 评论 -
Binary Tree Inorder Traversal
Binary Tree Inorder Traversal:class Solution {public: vector vec; vector inorderTraversal(TreeNode* root) { if (root == NULL) return vec; insert(root); return vec; } void insert(Tree原创 2016-06-29 09:25:53 · 154 阅读 · 0 评论 -
Maximum Product of Word Lengths(与运算作比较,代替循环)
这道题给我们了一个单词数组,让我们求两个没有相同字母的单词的长度之积的最大值。我开始想的方法是每两个单词先比较,如果没有相同字母,则计算其长度之积,然后每次更新结果就能找到最大值。但是我开始想的两个单词比较的方法是利用哈希表先将一个单词的所有出现的字母存入哈希表,然后检查另一个单词的各个字母是否在哈希表出现过,若都没出现过,则说明两个单词没有相同字母,则计算两个单词长度之积并更新结果。但是这种判断转载 2016-06-29 10:40:13 · 205 阅读 · 0 评论 -
"Roman to Integer" and "Integer to Roman"
罗马计数法规律太多太麻烦,窝选择背代码_(:зゝ∠)_int RomanToInt(string s) { map mp; mp['I'] = 1; mp['V'] = 5; mp['X'] = 10; mp['L'] = 50; mp['C'] = 100; mp['D'] = 500; mp['M'] = 1000; if (s.length() < 1) retur原创 2016-06-30 10:03:59 · 181 阅读 · 0 评论 -
“Count Primes” and "Range Sum Query - Immutable"
Count Primes:看了leetcode上的hint,大致明白了 Sieve of Eratosthenes方法。想用map存所有2到n的数,然而光把所有的数据扔到map中这样一个过程就超时了(囧,可能是insert太耗费时间了吧),而且map删除数据很麻烦,容易出错。官方给出的答案用了一个动态bool数组存储所有的数。还有一个重点是 Sieve of Eratosthenes方法中循环原创 2016-06-15 09:26:20 · 177 阅读 · 0 评论 -
Unique Paths
一开始用递归,中间计算结果超过int,返回0导致0被除以。顺便复习了一下函数表达式的写法。class Solution {public: int uniquePaths(int m, int n) { std::function fac = [&fac](int a) ->int { return a <= 0 ? 1 : fac(a - 1)*a; }; return fac(n原创 2016-07-13 10:04:49 · 153 阅读 · 0 评论 -
ZigZag Conversion
ZigZag Conversion:第一次做的时候一直在找规律,找到2*n-2之类的,这样思考解题思路很简单,但是编码起来很麻烦,循环的跳出条件很难确定,导致一直在debug。最后还是在网上找到了一份答案,这份答案是直接从头扫到尾,把不同行的字符放到字符串数组的对应位置。也就是说不必横着一行一行看,而是向下搜索,在斜着向上搜索,以此类推,我也是学到了变换思维的好处。同时如果是我来写这份代码的话原创 2016-06-16 14:45:26 · 247 阅读 · 0 评论 -
Single Number II
解法一: int 数据共有32位,可以用32变量存储 这 N 个元素中各个二进制位上 1 出现的次数,最后 在进行 模三 操作,如果为1,那说明这一位是要找元素二进制表示中为 1 的那一位。代码如下:[cpp] view plain copy print?class Solution { public:转载 2016-07-03 09:51:15 · 325 阅读 · 0 评论 -
Wiggle Subsequence
注意两个点:1.正负数的判断用乘法,小于0就说明两个数异号2.两个数相等,wiggle Subsequence的长度减13.读题没读清楚,[1,17,5,10,13,15,10,5,16,8]-->[1,17,10,13,10,16,8],其中5,15,5可以删掉,之前一直以为必须是连续的才行,所以我把这个数组分成了三个wiggle Subsequence,然后挑了一个最大的cla原创 2016-07-25 17:23:17 · 227 阅读 · 0 评论 -
Search a 2D Matrix II
从右上角开始, 比较target 和 matrix[i][j]的值. 如果小于target, 则该行不可能有此数, 所以i++; 如果大于target, 则该列不可能有此数, 所以j-- 注意循环的跳出条件是&&的关系class Solution {public: bool searchMatrix(vector>& matrix, int target) {原创 2016-07-26 11:32:28 · 152 阅读 · 0 评论 -
"First Bad Version" and "Excel Sheet Column Title"
First Bad Version:一看到这道题第一反应是动态规划扔鸡蛋那道经典题(琢磨许久之后看到答案是二分法窝真是一脸懵逼)。然而我不信邪,又研究了半天,发现动态规划也可以做,而且动态规划和二分法有很相似的地方,都是将数组划分为两个子数组,分别判断的过程,只不过二者的划分策略不一样,举个例子:可以看出来,由于动态规划使用等差数列形式划分数组的,导致区间大小不一样,而二分法的每个原创 2016-06-18 12:01:13 · 218 阅读 · 0 评论 -
Compare Version Numbers
Compare Version Numbers:虽然之前接触过用stream做string与int转换的方法,但是看到这道题还是想着用for循环去手动实现。分享一份网上的特别简洁的代码,也是让我体会到了代码的美感。class Solution {public: int compareVersion(string version1, string version2) {原创 2016-06-19 11:04:28 · 172 阅读 · 0 评论 -
Generate Parentheses
结果是一个二叉树,所以用递归求。重点是递归的进入和终止条件。class Solution {public: vector vec; vector generateParenthesis(int n) { recursive("", 0, 0, n); return vec; } void recursive(string result, int l, int r, int原创 2016-07-05 10:41:36 · 174 阅读 · 0 评论 -
Different Ways to Add Parentheses
class Solution {public: vector diffWaysToCompute(string input) { vector result; int size = input.size(); for (int i = 0; i < size; i++) { char cur = input[i]; if (cur == '+' || cur == '-原创 2016-07-15 19:09:10 · 182 阅读 · 0 评论 -
Counting Bits
Counting Bits:这道题要求时间复杂度降到O(n),所以要用二进制位计算的variable-precision SWAR算法,详细介绍见点击打开链接,我在这里重新解释一遍原理,也是为了仔细学习一下。int SWAR(unsigned int i) { i = i - ((i >> 1) & 0x55555555); i = (i & 0x3333333原创 2016-06-20 09:45:24 · 244 阅读 · 0 评论 -
"House Robber" and "House Robber III"
nums为{3, 2, 1, 5},那么dp[0]=3,dp[1]=3,得到递推公式dp[i] = max(num[i] + dp[i - 2], dp[i - 1]), 代码如下:// DPclass Solution {public: int rob(vectorint> &num) { if (num.size() 1) return num.empt原创 2016-05-31 11:00:34 · 187 阅读 · 0 评论 -
Single Number
Single Number:时间复杂度O(n),不能用额外的存储空间,自己思考实在想不出来,看答案用到了异或运算:class Solution {public: int singleNumber(vector& nums) { int result = 0; for (int i = 0; i<nums.size(); i++) { res原创 2016-06-20 19:29:33 · 155 阅读 · 0 评论 -
Super Ugly Number
梳理一下思路:首先看一下找第n个丑数的方法:根据丑数的定义,丑数应该是另一个丑数乘以2、3或者5的结果(1除外)。因此我们可以创建一个数组,里面的数字是排好序的丑数。里面的每一个丑数是前面的丑数乘以2、3或者5得到的。这种思路的关键在于怎样确保数组里面的丑数是排好序的。我们假设数组中已经有若干个丑数,排好序后存在数组中。我们把现有的最大丑数记做M。现在我们来生成下一个丑数,该丑数肯定是前面原创 2016-07-27 20:17:32 · 201 阅读 · 0 评论 -
Single Number III
Single Number III:做了Single Number I 还是不会做这道题。原来还是用异或运算提取了两个只出现一次的整数的信息,利用这个信息把数组分成两部分。考虑位操作,对所有元素做异或操作,那么最后得到的值就是要求的两个元素异或得到的,那么找出其中为1的某一位,说明这一位两个数一个为0,一个为1,以这一位为标准,把数组的元素分为两组A、B,那么要求的两个元素肯定是一个在A组原创 2016-06-21 09:13:10 · 158 阅读 · 0 评论 -
Convert Sorted Array to Binary Search Tree
编码时有很多逻辑小细节,分享一份代码:class Solution { public: TreeNode* generateBST(int left, int right, vector& num) { if (left > right) return nullptr; else if (left原创 2016-07-07 11:41:44 · 189 阅读 · 0 评论 -
Product of Array Except Self
Product of Array Except Self:O(n)时间复杂度,const额外存储空间,典型的用空间换时间的问题,之前遇到过一道求和的,这次变成求积了,原理一样,我们利用两个vector变量,先遍历一遍数组,vector1 每一个位置上存之前所有数字的乘积,再从后往前扫描,vector2 每个位置上存之后所有数字的乘积,最后在做一次循环,把vector1 和 vector2 对应原创 2016-06-22 11:44:26 · 126 阅读 · 0 评论 -
Unique Binary Search Trees
设C0 = 1,只有一个元素时可行的BST数量C1 = 1,有两个元素时可行的BST数量C2 = 2 ,C3 = C0*C2 + C1*C1 + C2*C0 , C4 =......这就是卡特兰数的定义。所以用动态规划来做。然而这种规律太难找了,我更倾向于寻找有启发性的思路。因为对于每一个节点,只有两种状态:作为根节点或不作为根节点,有二分的思想,然而很明显这道题不能用二分法做,同原创 2016-07-08 09:51:08 · 201 阅读 · 0 评论 -
Longest Increasing Subsequence
来源:点击打开链接一个各公司都喜欢拿来做面试笔试题的经典动态规划问题,互联网上也有很多文章对该问题进行讨论,但是我觉得对该问题的最关键的地方,这些讨论似乎都解释的不很清楚,让人心中不快,所以自己想彻底的搞一搞这个问题,希望能够将这个问题的细节之处都能够说清楚。对于动态规划问题,往往存在递推解决方法,这个问题也不例外。要求长度为i的序列的Ai{a1,a2,……,ai}最长递增子序列,需要转载 2016-07-29 09:57:02 · 155 阅读 · 0 评论 -
Top K Frequent Elements
做题涉及到的知识:1、堆排序中建堆过程时间复杂度O(n):这是一个bottom-up的建堆。于是,有1/2的元素向下比较了一次,有1/4的向下比较了两次,1/8的,向下比较了3次,......,1/2^k的向下比较了k次,其中1/2^k T = () * n令 S = 1/2 S = S - 1/2S = 1/2S = 到这步就很明显了吧原创 2016-06-23 12:41:52 · 181 阅读 · 0 评论