
leetcode
文章平均质量分 68
努力努力再努力r
这个作者很懒,什么都没留下…
展开
-
String:657. Judge Route Circle
这个题倒是很简单,没什么可说的:class Solution {public: bool judgeCircle(string moves) { int x = 0; int y = 0; for(int i = 0; i < moves.size(); ++i) { if(moves[i] ==原创 2017-09-13 09:48:34 · 160 阅读 · 0 评论 -
Backtracking:401. Binary Watch
这个题想半天不会,然后看了别人的死路才写出来。主要是回溯的思想,一条路走到黑,然后退回来走另一条路。class Solution { public: vector numbers = {8,4,2,1,32,16,8,4,2,1}; vector readBinaryWatch(int num) { vector res; int watc原创 2017-09-24 11:53:45 · 210 阅读 · 0 评论 -
String:13. Roman to Integer
罗马数字共有7个,即I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000)。1、重复数次:一个罗马数字重复几次,就表示这个数的几倍。2、右加左减:2.1 在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。2.2 在较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字。2.3 左减的数字有限制,仅限于I、X、C。比如45不可以原创 2017-09-08 15:26:15 · 186 阅读 · 0 评论 -
string:14. Longest Common Prefix
我的笨方法,建一个string result,让它的初值是vector里第一个string,然后遍历后面的string, 比较每一位,遇到不一样的位就截取result。过程中遇到的问题是substr用法: j位不一样: result = result.substr(0, j); 第一个参数是开始截取的位置,第二个参数是截取多少个字符。原创 2017-09-08 17:26:36 · 210 阅读 · 0 评论 -
String:20. Valid Parentheses
class Solution {public: bool isValid(string s) { map m = {{'}', '{'}, {')', '('}, {']', '['}}; stack t; if(s.size() == 0) return false; for(int i = 0; i <原创 2017-09-10 08:59:35 · 191 阅读 · 0 评论 -
String:28. Implement strStr()
我写的:class Solution {public: int strStr(string haystack, string needle) { int hsize = haystack.size(); int nsize = needle.size(); if(hsize < nsize) return -1;原创 2017-09-10 10:25:22 · 176 阅读 · 0 评论 -
String:38. Count and Say
我的乱糟糟的代码:class Solution {public: string countAndSay(int n) { string result = "1"; for(int i = 1; i < n; ++i) { result = count(result); //cout <<原创 2017-09-10 17:55:20 · 201 阅读 · 0 评论 -
String: 58. Length of Last Word
这个题这么简单,但是调了好久,最后直接求结果没调好,无奈申请了一个string存放结果,再返回string的长度。class Solution {public: int lengthOfLastWord(string s) { string result = ""; int i = s.size() - 1; while(s[i] ==原创 2017-09-10 20:41:28 · 130 阅读 · 0 评论 -
String:67. Add Binary
我写了……一个……很长的代码……唉,我先把短的那个数字补齐,也就是前面缺的那几位补0,然后再加。 注意result = char('0' + rx % 2) + result; 这里面这个强制类型转换是必须必的。不然会报错。class Solution {public: string addBinary(string a, string b) {原创 2017-09-10 21:20:21 · 146 阅读 · 0 评论 -
String:125. Valid Palindrome
我申请了一个vector来挑出字母和数字,并且在放入vector之前就全部转换成小写字母。 然后再遍历一遍vector,设前后两个指针往中间推。class Solution {public: bool isPalindrome(string s) { vector ss; for(int i = 0; i < s.size(); ++i)原创 2017-09-11 15:03:06 · 142 阅读 · 0 评论 -
String:344. Reverse String
我的代码,尝试着把前后两个指针都放到for循环里写了,代码确实好看了一些:class Solution {public: string reverseString(string s) { for(int start = 0,end = s.size() - 1; start < end; ++start,--end) { swa原创 2017-09-11 15:59:08 · 221 阅读 · 0 评论 -
String:345. Reverse Vowels of a String
我的代码,很常规的方法:class Solution {public: string reverseVowels(string s) { set ss = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'}; int i = 0, j = s.size() - 1; while(i <原创 2017-09-11 16:26:47 · 217 阅读 · 0 评论 -
String:383. Ransom Note
我的常规方法:class Solution {public: bool canConstruct(string ransomNote, string magazine) { map m; for(int i = 0; i < magazine.size(); ++i) { m[magazine[i]]++;原创 2017-09-11 19:07:38 · 141 阅读 · 0 评论 -
String:434. Number of Segments in a String
我的方法是,如果碰到不是空格的字符,count加1,然后指针往后一直到找到一个空格,然后从这个位置再接着往下找,碰到非空格的字符继续加1.class Solution {public: int countSegments(string s) { int count = 0; int cur = 0; while(cur < s.size原创 2017-09-11 19:59:33 · 177 阅读 · 0 评论 -
String:459. Repeated Substring Pattern
一开始写的总是超时,最后是看了提示才写出来的。关键是重复字符串长度一定不大于s的二分之一,而且s的长度一定能整除字符串长度。满足这个条件的重复字符串就大大减少了,就不会超时了。下面是我写的:class Solution {public: bool repeatedSubstringPattern(string s) { int n = s.size();原创 2017-09-12 08:23:24 · 358 阅读 · 0 评论 -
String:520. Detect Capital
我的方法:很常规,设一个count记录大写字母的个数,如果是0,则true;如果是1,则返回第一个字符是否是true;如果等于总字符数,返回true,其他情况都是false。class Solution {public: bool detectCapitalUse(string word) { int count = 0; for(int i = 0;原创 2017-09-12 15:13:11 · 174 阅读 · 0 评论 -
String:521. Longest Uncommon Subsequence I
这是啥题啊……题目一直没理解对,看了答案才知道是这个意思……这题好没劲:class Solution {public: int findLUSlength(string a, string b) { if(a.size()!=b.size()) return max(a.size(), b.size()); else {原创 2017-09-12 16:18:16 · 151 阅读 · 0 评论 -
String:541. Reverse String II
提交了好几遍才过的。思路就是设一个下标cur,是每个2k的开始位置,根据cur判断cur位置后面够不够2k,如果不够k,翻转剩下的所有;如果够k但不够2k,翻转前k个。class Solution {public: string reverseStr(string s, int k) { int cur = 0; while(1) {原创 2017-09-12 16:57:23 · 220 阅读 · 0 评论 -
String:551. Student Attendance Record I
思路很简单,就是统计A和L的个数,A不用说,L的统计是这样的,不仅遇到L要加1,而且遇到不是L的字符要把L置0.这是我写的:class Solution {public: bool checkRecord(string s) { int countA = 0; int countL = 0; for(int i = 0; i < s.s原创 2017-09-12 17:12:56 · 207 阅读 · 0 评论 -
String:557. Reverse Words in a String III
思路很简单,遍历字符串,碰到空格就翻转这之前的一个字符。这是我写的:class Solution {public: string reverseWords(string s) { int cur = 0; for(int i = 0; i < s.size(); ++i) { if(s[i] == ' ')原创 2017-09-12 17:24:30 · 163 阅读 · 0 评论 -
String:606. Construct String from Binary Tree
递归,为什么我写递归也这么长??/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL)原创 2017-09-13 08:58:07 · 169 阅读 · 0 评论 -
(M)DFS:207. Course Schedule
建立有向图,用二维数组来建立,需要一个一维数组visit来记录访问状态,这里有三种状态,0表示还未访问过,1表示已经访问了,-1表示有冲突。大体思路是,先建立好有向图,然后从第一个门课开始,找其可构成哪门课,暂时将当前课程标记为已访问,然后对新得到的课程调用DFS递归,直到出现新的课程已经访问过了,则返回false,没有冲突的话返回true,然后把标记为已访问的课程改为未访问。class So原创 2017-10-16 22:41:03 · 224 阅读 · 0 评论 -
(M)DFS:210. Course Schedule II
这道题考察拓扑排序。思路是依次输出入度为0的节点。入度为0表示没有可以构成他的其他节点,但是他可以构成别人,所以这门课要先选。首先把图中所有的入度为0的节点压栈,然后依次弹出一个节点,把这个节点所连的节点的入度依次减1,如果减1之后入度为0,压栈。如此循环,直到栈为空。class Solution {public: vector findOrder(int numCourses,原创 2017-10-17 21:15:03 · 216 阅读 · 0 评论 -
(M)DFS:417. Pacific Atlantic Water Flow
从边缘当作起点开始遍历搜索,然后标记能到达的点位true,分别标记出pacific和atlantic能到达的点,那么最终能返回的点就是二者均为true的点。class Solution {public: vector> pacificAtlantic(vector>& matrix) { if (matrix.empty() || matrix[0].empty())原创 2017-10-15 21:30:39 · 210 阅读 · 0 评论 -
(M)DFS:117. Populating Next Right Pointers in Each Node II
这个题和之前的一样,要为二叉树每个节点填充next指针。但是这个题并不要求完全二叉树,而是随便一棵普通的二叉树。举个例子:[1,2,3,4,#,#,5],就不能用之前的做法。这个题的思路是这样:还是根据当前节点node,填充node->left和node->right的next指针,首先根据node->next->next->...(node这一层的所有节点)找到最先出现的node下面一层原创 2017-10-15 20:24:26 · 236 阅读 · 0 评论 -
(M)DFS:473. Matchsticks to Square
大神分析:这道题让我们用数组中的数字来摆出一个正方形。跟之前有道题Partition Equal Subset Sum有点像,那道题问我们能不能将一个数组分成和相等的两个子数组,而这道题实际上是让我们将一个数组分成四个和相等的子数组。我一开始尝试着用那题的解法来做,首先来判断数组之和是否是4的倍数,然后还是找能否分成和相等的两个子数组,但是在遍历的时候加上判断如果数组中某一个数字大于一条边的长原创 2017-10-15 16:09:15 · 284 阅读 · 0 评论 -
(M)BFS:103. Binary Tree Zigzag Level Order Traversal
这道题意思是按照“之”字形遍历一棵树。我的做法是dfs把每一行按照正常的顺序存下来,最后把奇数行倒置。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int原创 2017-10-18 18:39:33 · 212 阅读 · 0 评论 -
(M)BFS:310. Minimum Height Trees
求给定图中,能形成树的最矮的树。BFS,利用无向图每个点的degree来计算。先计算每个点的degree,然后将degree为1的点放入list或者queue中进行计算,把这些点从邻接表中去除,然后计算接下来degree = 1的点。最后剩下1 - 2个点就是新的root。class Solution {public: vector findMinHeightTrees(int原创 2017-10-18 20:59:26 · 208 阅读 · 0 评论 -
(M)BFS:130. Surrounded Regions
这道题用的是DFS。扫面矩阵的四条边,如果有O,则用DFS遍历,将所有连着的O都变成另一个字符#。这样剩下是O的就是被X包围着的O,都应该变成X。最后把#再变回O就可以了。class Solution {public: void solve(vector>& board) { if(board.empty() || board[0].empty() || bo原创 2017-10-18 21:34:37 · 200 阅读 · 0 评论 -
(M)Backtracking:526. Beautiful Arrangement
这道题的意思是,给一个数字N,从1到N的这些书构成一个序列,使得序列中第i个数满足:i能整除这个数,或者这个数能整除i。问给定的N,满足这个要求的序列能有多少个。想到了卖火柴的小女孩那个题,Matchsticks to Square。这个题里出现一个问题是,求一个数组能不能分成四个和相等的数组。写法和这个差不多。遍历每一个位置i,看i位置能放哪个数,放下这个数后对i+1递归,然后i这个位置试着放下原创 2017-10-18 22:21:36 · 198 阅读 · 0 评论 -
(M)Backtracking:22. Generate Parentheses
这道题网上很多大神分析,我没有写出来,原因是没有发现一个重要的线索是,在某一个时刻必须要保证左括号数>右括号数,否则现在的字符串就是不满足要求的。对于每一个位置,都有两个选择:放左括号或者放右括号。放左括号没有限制,只要现在手头上还有剩余的左括号就可以放,放右括号有限制条件,不仅仅手头上要有剩余的右括号可以放,而且当前已经有的左括号数必须大于已经有的右括号数,如果当前的左括号数小于等于当前右括号数原创 2017-10-18 23:03:08 · 156 阅读 · 0 评论 -
(M)Backtracking:216. Combination Sum III
这道题的意思是找出所有可能的和为n的k项组合,组合的项仅能从1-9中选择,且组合中数字不能重复。这个题比较简单,回溯法。选k个数,每一个位置都有1-9这些可能,选择满足条件的一个然后在现在的状态下继续递归。一开始我想用一个vector表示1~9这些数字中还有哪些没有选过。但是这样出现了答案中的数字一样但是顺序不一样,也算成了不同的答案。但实际上选择一样的数字只需要一个就可以了。看了大神的解答,原创 2017-10-19 11:06:25 · 162 阅读 · 0 评论 -
(M)Backtracking:46. Permutations
输出给定数组的所有全排列。这道题还是比较简单的回溯。根据上一篇216Combination Sum3的经验,这次是要输出给定数组的所有全排列,要用到一个visit数组来标识哪些数现在是可以选的。class Solution {public: vector> permute(vector& nums) { vector> res; vector原创 2017-10-19 11:18:31 · 190 阅读 · 0 评论 -
(M)Backtracking:78. Subsets
这道题是给出一个数组,写出他的所有子集合。一开始我的想法是,子集合里存放的数字个数可能是0个,1个,2个...n个,针对这n+1种可能,每一种分别求。但是没有调出来。后来看了别人代码,发现不用这么麻烦,每次递归都往结果集里加就可以。class Solution {public: vector> subsets(vector& nums) { vector> res原创 2017-10-19 14:27:41 · 229 阅读 · 0 评论 -
(M)Backtracking:77. Combinations
这道题的意思是给一个数n,再给一个数k,问1~n这些数字里面能够成多少个长度为k的组合。简单的回溯。class Solution {public: vector> combine(int n, int k) { vector> res; vector r; backtracking(n, k, 1, res, r); r原创 2017-10-19 15:44:34 · 225 阅读 · 0 评论 -
(M)Backtracking:39. Combination Sum
这道题意思是给你一个数组,再给你一个目标值target,写出所有和是target的子数组。这个题一开始求出来的结果是[2,2,3][2,3,2][3,2,2][7],发现有重复的,所以先把数组从小到大排序,选择数字的时候只往右边选,不往回选,这样就不会出现重复数组了。class Solution {public: vector> combinationSum(vector& ca原创 2017-10-19 15:55:58 · 154 阅读 · 0 评论 -
(M)Backtracking:90. Subsets II
这道题还是给出一个数组,要求找出所有的子集合,但是与之前不同的是,这次给出的数组有重复的数。看了大神的分析:拿题目中的例子[1 2 2]来分析,根据之前 Subsets 子集合 里的分析可知,当处理到第一个2时,此时的子集合为[], [1], [2], [1, 2],而这时再处理第二个2时,如果在[]和[1]后直接加2会产生重复,所以只能在上一个循环生成的后两个子集合后面加2,发现了这一点原创 2017-10-19 20:13:31 · 229 阅读 · 0 评论 -
(M)Backtracking:17. Letter Combinations of a Phone Number
这道题让我们求电话号码的字母组合,即数字2到9中每个数字可以代表若干个字母,然后给一串数字,求出所有可能的组合。我想到类似全排列那样的题目,这道题也是典型的回溯问题,每一个位置都有几个选择,求这些选择的全排列。但是以前的题目是,这些位置有一个共同的选择范围,一般是一个数组。但是这个题是,每个位置有每个位置各自不同的选择范围。其实还是一样的,只是要设一个字典,再设一个level表示现在是在哪一个原创 2017-10-19 20:32:49 · 191 阅读 · 0 评论 -
(M)Backtracking:40. Combination Sum II
这道题是Combination Sum的改进,给出一个数组,可能有重复数字,给出一个target,写出所有和为target的组合。这个题的变化是,一个数只能用一次。首先给数组排序,然后按照上一个题的方法写就行。但是这样有一个问题,因为有重复数字,所以有些组合会加两遍。所以我用了set结构,最后再转化成vector返回。class Solution {public: vector>原创 2017-10-19 20:46:42 · 192 阅读 · 0 评论 -
(M)Backtracking:131. Palindrome Partitioning
这道题是说,给一个字符串,要把这个字符串分割,分割成几个回文串。写出所有的分割方案。首先想到的方法是,从第一个字符串到最后一个字符串,每一个位置都可以选择分割或不分割。所以一个位置一个位置的遍历,再写一个判断一个字符串是否是回文串的函数。这样复杂度很高,本以为会超时,但是ac了。class Solution {public: vector> partition(string s)原创 2017-10-19 21:33:32 · 165 阅读 · 0 评论