LeetCode
文章平均质量分 57
HouseFangFZC
oo
展开
-
LeetCode 70 Climbing Stairs
题意:每次迈步可以跨越1或2个台阶,问爬n阶台阶的方案有几种。思路:简单的dp题,dp[i]表示爬n阶台阶的方案数,则dp[i] = dp[i - 1] + dp[i - 2]。而且为了优化空间,dp数组可以滚动。代码:class Solution {public: int climbStairs(int n) { int dp[3];原创 2017-10-26 15:05:00 · 321 阅读 · 0 评论 -
LeetCode 52 N-Queens II
题意:n皇后问题,与 http://blog.csdn.net/houserabbit/article/details/72758088 不同,本题指数出解的个数,不要求方案。思路:可以用一下比LeetCode 51更优化的搜索方法,每放置一个皇后,我们记录它可以攻击哪一列、以及通过斜线攻击到的第一行的某2个位置。这样在放置皇后的时候,是否能放置到某个位置就可以O(1)判断了。原创 2017-05-26 09:14:39 · 337 阅读 · 0 评论 -
LeetCode 51 N-Queens
题意:n皇后问题,输出n*n的棋盘摆放n个皇后的方案。皇后攻击方式为同一行、同一列、同一斜线。思路:直接搜索。空间消耗方面,不需要申请整个棋盘大小,只要O(n)就够了,存某一行的皇后放在哪一列。代码:class Solution {public: vector> solveNQueens(int n) { int *column =原创 2017-05-25 21:51:48 · 297 阅读 · 0 评论 -
LeetCode 50 Pow(x, n)
题意:实现pow(x, n),即实数x的整数n次方。思路:快速幂算法。将指数表示成二进制,这时迭代生成x的1、2、4、16……次方,如果指数的二进制表示种某位为1,那么把对应x的某次方乘到答案里。代码:class Solution {public: double myPow(double x, int n) { if (x > -1e-原创 2017-05-25 20:12:52 · 271 阅读 · 0 评论 -
LeetCode 49 Group Anagrams
题意:如果两个单词由相同字母数组成那么它们应该分成一组,求给出单词的分组。思路:为每个单词做字母计数,然后根据计数排序,这样相同字母组成的单词就会挨在一起,最后按顺序分下组就行了。代码:#define N 26class Solution {public: vector> groupAnagrams(vector &strs) {原创 2017-05-25 19:59:06 · 271 阅读 · 0 评论 -
LeetCode 48 Rotate Image
题意:将一个正方形矩阵顺时针旋转90度。思路:2种方式——1.正常想法 —— 先对角线对称,再左右对称。 代码9ms。2.迷之规律 —— 在正方形里面画一个叉,分成的4个三角形相互替换。 代码6ms。代码:/** * 迷之规律 —— 在正方形里面画一个叉,分成的4个三角形相互替换。 6ms */class Solution {public:原创 2017-05-25 19:48:42 · 277 阅读 · 0 评论 -
LeetCode 46 Permutations + LeetCode 47 Permutations II
题意:给出一串不重复的数字,要求输出所有排列。思路:可以偷懒用next_permutation方法也可以自己实现,实现方法为从后往前找第一个出现的nums[i] 代码:原创 2017-05-25 19:21:03 · 375 阅读 · 0 评论 -
LeetCode 45 Jump Game II
题意:给出一个步长数组nums,如果一个人站在i这个点上那么他可以向右最多走nums[i]步,求从左端点走到右端点的最少步数。思路:如果点x可以用dp[x]步到达,那么[ x + 1, x + nums[x] ]区间内的点都可以用dp[x] + 1步到达。利用这个想法,可以O(n)的求出走一步可以到达哪些位置,走两步可以到达哪些位置,以此类推。代码:clas原创 2017-05-25 18:55:34 · 275 阅读 · 0 评论 -
LeetCode 44 Wildcard Matching
题意:给出一个字符串s和一个模式串p,p中的"?"表示任意单个字符,"*"表示任意字符串(可以是空串),问s和p是否匹配。思路:不同于 http://blog.csdn.net/houserabbit/article/details/54288851 这道题但是很相似,搜索效率低,所以用dp。dp[i][j]表示p串i位置之前与s串j位置之前是否匹配,状态转移方程即:p原创 2017-05-25 17:14:07 · 305 阅读 · 0 评论 -
LeetCode 43 Multiply Strings
题意:输入2个表示非负数的字符串,求它们的乘积。思路:暴力模拟吧!!19ms能过。我利用单个位置上数字只有10个来优化乘法次数,效率能提高到9ms。代码:/** * 利用数字个数优化 9ms */class Solution {public: string multiply(string num1, string num2) {原创 2017-05-25 16:29:08 · 301 阅读 · 0 评论 -
LeetCode 42 Trapping Rain Water
题意:给出一个代表高度的数组,求出由它组成的形状能储存多少体积的水。(下例中蓝色表示水)思路:本题有O(nlogn)排序解法和O(n)单调栈解法。排序解法——从大到小的排序数字,然后按顺序放置到数轴上。因为储水的高度取决于一段区间左右两端最高的高度,所以处理高度的方式是从大到小。对于当前需要安放的数字,如果它在之前安放的最左和最右两个位置之内,则答案中需要减去一部分原创 2017-05-24 19:15:14 · 395 阅读 · 0 评论 -
LeetCode 41 First Missing Positive
题意:求给出的一串数字中的最小的缺失的连续正整数。要求时间复杂度O(n),空间复杂度O(1)。思路:虽然不能排序,但是连续正整数这个性质比较特殊,举例来说:假设扫描数字串的时候遇到一个3,那就把它放在第3个位置。那么当把所有的数字都放好之后,从前到后扫描数字串,最先断开的地方就是答案。代码:class Solution {public: int fir原创 2017-05-24 18:11:40 · 218 阅读 · 0 评论 -
LeetCode 40 Combination Sum II
题意:集合中的每个数字只能使用一次,求出所有数字和为target的方案。思路:如果把集合中的数字计数,问题会变得和 http://blog.csdn.net/houserabbit/article/details/72677176 几乎一致。我的方法思路与计数思路几乎一致,只不过我没有合并数字,而是枚举每种数字个数的时候只取排在后面的数字,这样就保证了方案不重复。原创 2017-05-24 16:25:09 · 278 阅读 · 0 评论 -
LeetCode 39 Combination Sum
题意:数字集合中的每个数字可以使用无限次,求出所有的数字和为给定target的方案。思路:如果target小的话,可以当成完全背包问题来处理,但是target数值可能很大,所以干脆就搜索吧= =从大到小的搜索集合中的数字并枚举使用次数。代码:class Solution {public: vector> combinationSum(vector原创 2017-05-24 16:07:42 · 263 阅读 · 0 评论 -
LeetCode 38 Count and Say
题意:定义一种迭代,1, 11, 21, 1211, 111221, ...,比如1211 -> 111221表示1211从左往右读为1个1、1个2、2个1,求迭代n轮的结果。思路:用string暴力模拟迭代过程,不推荐迭代计数x个y这种方式,因为x>9的时候会变成2个数字,用string更好处理。代码:class Solution {public:原创 2017-05-24 15:01:28 · 268 阅读 · 0 评论 -
LeetCode 37 Sudoku Solver
题意:给出一个一定有解的填了一部分的数独,要求填满它。思路:我是分2步解决这个问题的:第1步检查每个格子可能填哪几个数字,第2步dfs搜索结果。dfs的时候只搜索第1步中找出的可能的数字,每次尝试填入一个格子并更新当前行、当前列、当前3*3格子的可选数字,注意回溯。我的代码3ms就可以跑完,效率还是很不错的。代码:class Solution {p原创 2017-05-24 14:49:21 · 255 阅读 · 0 评论 -
LeetCode 53 Maximum Subarray
题意:给出一个数字数组,求其中和最大的子串。思路:经典的dp题。对于一个数字,要么把它合并到了之前开始的某个串中,要么从它开始一段新的串。所以,用dp[i]表示包含第i个数字的最大子串和,则dp[i] = max(dp[i -1] + nums[i], nums[i])。换一种想法,如果某个串的和是正数那么它继续增长才是有意义的。所以,可以维护一个子串和,如果子串和为正原创 2017-05-26 09:27:53 · 291 阅读 · 0 评论 -
LeetCode 54 Spiral Matrix
题意:给出一个数字矩阵,要求从左上角开始蛇形输出。思路:可以这样想,对于一个矩阵,每次输出都是它最外层的一圈,迭代着做。即从当前圈的左上角先到右上角再到右下角最后到左下角。代码:class Solution {public: vector spiralOrder(vector> &matrix) { vector ans;原创 2017-05-26 09:36:03 · 334 阅读 · 0 评论 -
LeetCode 69 Sqrt(x)
题意:不使用sort(x),实现求x的平方根。思路:二分搜索x……代码:class Solution {public: int mySqrt(int x) { if (x == 0 || x == 1) { return x; } int ans = 1; int原创 2017-10-26 14:59:45 · 328 阅读 · 0 评论 -
LeetCode 68 Text Justification
题意:给出许多单词和一行能显示的最大长度,将所有单词按照两端对齐的方式进行排版,最后一行左对齐并用空格补齐长度。思路:一行一行的排版,每一行检查最多能放几个单词,即先假设单词之间只用1个空格分隔。确定了一行要显示的单词数后,判断是否为最后一行,如果是,那么单词间用1个空格分隔,最后补空格到行最大长度;若不是最后一行,则每个单词后跟几个空格需要计算,计算方法见代码19和20行原创 2017-10-26 14:47:41 · 289 阅读 · 0 评论 -
LeetCode 67 Add Binary
题意:两个二进制数相加,输出结果思路:各种模拟均可,比如先把A和B倒过来,再按位相加,最后把结果再倒回来。不过为了快,我是这样做的——假设A比B长,那么我对位相加B的长度。这时如果没有进位,那么A长出B的部分就不会变了;如果有进位,那么继续往A的高位加,直到某一次进位为0,那么更高位的A就不变了;如果直到最后还有进位,那就最前面添加一个最高位1。代码:cla原创 2017-06-19 15:47:45 · 376 阅读 · 0 评论 -
LeetCode 66 Plus One
题意:给出高精度数,输出它+1的结果思路:从个位开始加,如果某个时刻进位已经没有了,那么没有必要再加下去了。如果一直进位,最后记得添加一个最高位。代码:class Solution {public: int mySqrt(int x) { if (x == 0 || x == 1) { return x;原创 2017-06-19 15:37:45 · 334 阅读 · 0 评论 -
LeetCode 65 Valid Number
题意:给定一个字符串,判断它是不是一个数字。思路:首先要把字符串头尾的空格去掉。接着可以分2种数字表示方法讨论,1.普通写法 2.科学计数法。普通写法判断依据为,一定要有数字出现,一定没有0123456789+-.之外的字符出现,对于+-只能出现在第一位或者不出现,对于.如果是浮点数的话只能出现一次。注意.3表示0.3,3.表示3.0,都是合法的,但是.不能表示0.原创 2017-05-31 19:34:32 · 430 阅读 · 0 评论 -
LeetCode 64 Minimum Path Sum
题意:在数字矩阵中,每次行动向下或向右走一格,问从左上角到右下角的路径中数字和最小的是多少。思路:和 http://blog.csdn.net/houserabbit/article/details/72822932 的dp几乎一致,用dp[i][j]表示第i行第j列的路径和,则转移方程为 dp[i][j] = grid[i][j] + min (dp[i - 1][j], d原创 2017-05-31 19:16:03 · 359 阅读 · 0 评论 -
LeetCode 63 Unique Paths II
题意:给出一个带有障碍物的棋盘,每次行动向下或向右移动一格,求从左上角到右下角有几种方案。思路:简单dp题,假设dp[i][j]表示第i行第j列的方案数,那么状态转移方程就为 dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 。注意下边界条件就好了,而且对于障碍物,直接把dp清零即可。可以发现这个dp只和当前行和上一行有关,进而做空间优化,用原创 2017-05-31 19:09:38 · 344 阅读 · 0 评论 -
LeetCode 62 Unique Paths
题意:一个n*m的棋盘,每次行动只能向下或者向右走1格,求从左上角走到右下角有几种不同的方案数。思路:因为行动只能向下向右,所以总步数是一定的,即n - m + 2步。那么问题就变成了这里面的哪几步是向下的,就是组合数了,即从n - m + 2个中选n - 1个的组合数。题目里说的n和m值太夸张了,因为他的函数返回int……所以肯定很小。代码:class S原创 2017-05-31 18:59:35 · 387 阅读 · 0 评论 -
LeetCode 61 Rotate List
题意:将链表旋转k次,每次旋转表示为1->2->...->N变为N->1->2->...->N-1。思路:首先要测链表总长度n,因为k如果比n大,那么旋转整圈是没意义的。然后求出实际要旋转的次数x,最后就是简单的链表在n-x分割再头尾合并了。代码:/** * Definition for singly-linked list. * struct List原创 2017-05-26 11:36:27 · 315 阅读 · 0 评论 -
LeetCode 60 Permutation Sequence
题意:输入数字n和k,n表示给出数组[1, 2, 3, 4 ... n],输出这个数组的第k个排列。思路:这种题目和“使用一些数字,找出它们能组成的第k小的数字”是一样的,很典型的数位dp问题。假设我们已经确定了前i - 1位,现在确定第i位的数字是什么,也就是说现在要用剩下的n - i + 1个数字的第x个排列(x那么我们可以将剩下的数字从大到小枚举,如果第i位填x,原创 2017-05-26 11:13:19 · 403 阅读 · 0 评论 -
LeetCode 59 Spiral Matrix II
题意:画出n*n的蛇形矩阵。思路:与 http://blog.csdn.net/houserabbit/article/details/72763411 一致,更简单一点,因为它是正方形……这题还可以扩展,因为如果不是让画出矩阵,只是输出坐标(x,y)的数字是几,那么完全可以不开空间存矩阵,按照矩阵生成方法生成到(x,y)坐标时输出即可。代码:class S原创 2017-05-26 10:58:51 · 339 阅读 · 0 评论 -
LeetCode 58 Length of Last Word
题意:求一个一串字符中,最后一个单词的长度。思路:巨无聊一个题…… 从尾开始去掉空格,这时开始计数字母,直到串的头或者遇到空格为止。代码:class Solution {public: int lengthOfLastWord(string s) { int n = s.size(); if (n == 0) {原创 2017-05-26 10:50:12 · 302 阅读 · 0 评论 -
LeetCode 57 Insert Interval
题意:给出一些区间和一个待插入的区间,求他们的并。思路:如果把区间都放在一起,排好序,就可以按 http://blog.csdn.net/houserabbit/article/details/72763935 的方法做。但很显然有更高效的one pass方法。如果新区间与老区间都没有交,那么直接插入,如果有交,则维护区间的开始和终止位置在哪。代码:/*原创 2017-05-26 10:44:27 · 330 阅读 · 0 评论 -
LeetCode 56 Merge Intervals
题意:给出一些区间,求这些区间的并集。思路:按起点排序,维护该起点可以通过多个区间将终点延伸到哪里,即可。代码:/** * Definition for an interval. * struct Interval { * int start; * int end; * Interval() : start(0), end(0)原创 2017-05-26 10:18:18 · 293 阅读 · 0 评论 -
LeetCode 55 Jump Game
题意:给出一个步长数组nums,如果一个人站在i这个点上那么它可以向右最多走nums[i]步,问能否从最左端走到最右端。思路:这是一道比 http://blog.csdn.net/houserabbit/article/details/72736549 简单的题,只需要维护能走到的右端点在哪里,最后判断是不是最右端即可。代码:class Solution {p原创 2017-05-26 09:58:05 · 371 阅读 · 0 评论 -
LeetCode 36 Valid Sudoku
题意:判断一个填了一部分的数独有没有解。思路:按照数独规则判断即可,即同一行、同一列、同一个3*3的方格内没有数字重复出现。代码:class Solution {public: bool isValidSudoku(vector > &board) { const int step = 3; bool app[step原创 2017-05-24 14:27:56 · 304 阅读 · 0 评论 -
LeetCode 30 Substring with Concatenation of All Words
题意:给出字符串s和许多等长(len)单词w,找出所有s中的满足子串为w中所有单词的一种组合的位置。思路:因为w中的单词要满足的是组合而不是排列,因此用“区间[L,R]中包含单词的计数”来维护比较合适。一是满足了组合对顺序的不要求,二是方便处理重复的单词。首先可以统计一下,w中各种单词个数。如果s的长度为size(w) * len的子串单词计数与w相同,则找到一个答案。原创 2017-01-30 17:21:02 · 252 阅读 · 0 评论 -
LeetCode 29 Divide Two Integers
题意:不用*/和%实现除法计算,返回int,如果超过int最大值则返回最大值。思路:一开始想到了高精度模拟,但还是要用*/%。后来才想到位运算这回事。基本思想都是试商法,只不过用位运算的时候,试的是答案的二进制位。符号通过被除数和除数异或来计算。注意细节,除数为0。还有数据类型要用long long,要不然INT32_MIN没有对应的int正数!!代码:原创 2017-01-30 16:22:32 · 261 阅读 · 0 评论 -
LeetCode 31 Next Permutation
题意:给出一串数字,求该排列的下一个排列。如果该排列为字典序最大排列,则输出字典序最小排列。思路:首先C++里面有求下一个排列的函数next_permutation,该函数返回0即表示当前排列字典序最大。如果要自己动手实现,那么就考虑“如何找到比当前排列大1的排列”。假设排列A(aaaXddd)比排列B(aaaYfff)大1,a部分为两排列相同部分,X与Y表示最靠左边不原创 2017-02-16 16:08:50 · 304 阅读 · 0 评论 -
LeetCode 15 3Sum
题意:求不重复的使得x + y + z = 0的(x, y, z)组合。思路:为了防止重复可以按x 我的代码好慢…不知道是不是用了long long的缘故…求快速的代码??代码://// Created by house on 1/9/17.//class Solution {public: vector > threeSum(vector原创 2017-01-09 15:50:43 · 251 阅读 · 0 评论 -
LeetCode 14 Longest Common Prefix
题意:最长公共前缀思路:一个字符一个字符的考虑即可,但是写代码时候要小心,也许当前string已经不够长了,或者它一个字符串都没给你…官方题解很成功的把简单题想得巨烦,建议看着玩玩即可,思考下大数据下算法的扩展性。代码://// Created by house on 1/9/17.//class Solution {public: str原创 2017-01-09 15:43:53 · 256 阅读 · 0 评论 -
LeetCode 13 Roman to Integer
题意:把罗马数字变成数字。思路:简单模拟。我用了个map有点蠢,其实写个switch更好点吧。代码://// Created by house on 1/9/17.//class Solution {public: int romanToInt(string s) { map toint; toint['I']原创 2017-01-09 15:36:43 · 241 阅读 · 0 评论