自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

House

退役acmer,现在FDU研究数据库、分布式、时间序列数据挖掘等相关内容。(欢迎交流,题材不限…尺度不限…)

  • 博客(286)
  • 收藏
  • 关注

原创 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 276

原创 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 289

原创 LeetCode 68 Text Justification

题意:给出许多单词和一行能显示的最大长度,将所有单词按照两端对齐的方式进行排版,最后一行左对齐并用空格补齐长度。思路:一行一行的排版,每一行检查最多能放几个单词,即先假设单词之间只用1个空格分隔。确定了一行要显示的单词数后,判断是否为最后一行,如果是,那么单词间用1个空格分隔,最后补空格到行最大长度;若不是最后一行,则每个单词后跟几个空格需要计算,计算方法见代码19和20行

2017-10-26 14:47:41 255

原创 LeetCode 67 Add Binary

题意:两个二进制数相加,输出结果思路:各种模拟均可,比如先把A和B倒过来,再按位相加,最后把结果再倒回来。不过为了快,我是这样做的——假设A比B长,那么我对位相加B的长度。这时如果没有进位,那么A长出B的部分就不会变了;如果有进位,那么继续往A的高位加,直到某一次进位为0,那么更高位的A就不变了;如果直到最后还有进位,那就最前面添加一个最高位1。代码:cla

2017-06-19 15:47:45 328

原创 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 292

原创 LeetCode 65 Valid Number

题意:给定一个字符串,判断它是不是一个数字。思路:首先要把字符串头尾的空格去掉。接着可以分2种数字表示方法讨论,1.普通写法 2.科学计数法。普通写法判断依据为,一定要有数字出现,一定没有0123456789+-.之外的字符出现,对于+-只能出现在第一位或者不出现,对于.如果是浮点数的话只能出现一次。注意.3表示0.3,3.表示3.0,都是合法的,但是.不能表示0.

2017-05-31 19:34:32 385

原创 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 316

原创 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 307

原创 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 325

原创 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 278

原创 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 348

原创 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 296

原创 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 264

原创 LeetCode 57 Insert Interval

题意:给出一些区间和一个待插入的区间,求他们的并。思路:如果把区间都放在一起,排好序,就可以按 http://blog.csdn.net/houserabbit/article/details/72763935 的方法做。但很显然有更高效的one pass方法。如果新区间与老区间都没有交,那么直接插入,如果有交,则维护区间的开始和终止位置在哪。代码:/*

2017-05-26 10:44:27 292

原创 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 251

原创 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 322

原创 LeetCode 54 Spiral Matrix

题意:给出一个数字矩阵,要求从左上角开始蛇形输出。思路:可以这样想,对于一个矩阵,每次输出都是它最外层的一圈,迭代着做。即从当前圈的左上角先到右上角再到右下角最后到左下角。代码:class Solution {public: vector spiralOrder(vector> &matrix) { vector ans;

2017-05-26 09:36:03 290

原创 LeetCode 53 Maximum Subarray

题意:给出一个数字数组,求其中和最大的子串。思路:经典的dp题。对于一个数字,要么把它合并到了之前开始的某个串中,要么从它开始一段新的串。所以,用dp[i]表示包含第i个数字的最大子串和,则dp[i] = max(dp[i -1] + nums[i], nums[i])。换一种想法,如果某个串的和是正数那么它继续增长才是有意义的。所以,可以维护一个子串和,如果子串和为正

2017-05-26 09:27:53 249

原创 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 294

原创 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 258

原创 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 237

原创 LeetCode 49 Group Anagrams

题意:如果两个单词由相同字母数组成那么它们应该分成一组,求给出单词的分组。思路:为每个单词做字母计数,然后根据计数排序,这样相同字母组成的单词就会挨在一起,最后按顺序分下组就行了。代码:#define N 26class Solution {public: vector> groupAnagrams(vector &strs) {

2017-05-25 19:59:06 224

原创 LeetCode 48 Rotate Image

题意:将一个正方形矩阵顺时针旋转90度。思路:2种方式——1.正常想法 —— 先对角线对称,再左右对称。 代码9ms。2.迷之规律 —— 在正方形里面画一个叉,分成的4个三角形相互替换。 代码6ms。代码:/** * 迷之规律 —— 在正方形里面画一个叉,分成的4个三角形相互替换。 6ms */class Solution {public:

2017-05-25 19:48:42 232

原创 LeetCode 46 Permutations + LeetCode 47 Permutations II

题意:给出一串不重复的数字,要求输出所有排列。思路:可以偷懒用next_permutation方法也可以自己实现,实现方法为从后往前找第一个出现的nums[i] 代码:

2017-05-25 19:21:03 305

原创 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 243

原创 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 269

原创 LeetCode 43 Multiply Strings

题意:输入2个表示非负数的字符串,求它们的乘积。思路:暴力模拟吧!!19ms能过。我利用单个位置上数字只有10个来优化乘法次数,效率能提高到9ms。代码:/** * 利用数字个数优化 9ms */class Solution {public: string multiply(string num1, string num2) {

2017-05-25 16:29:08 252

原创 LeetCode 42 Trapping Rain Water

题意:给出一个代表高度的数组,求出由它组成的形状能储存多少体积的水。(下例中蓝色表示水)思路:本题有O(nlogn)排序解法和O(n)单调栈解法。排序解法——从大到小的排序数字,然后按顺序放置到数轴上。因为储水的高度取决于一段区间左右两端最高的高度,所以处理高度的方式是从大到小。对于当前需要安放的数字,如果它在之前安放的最左和最右两个位置之内,则答案中需要减去一部分

2017-05-24 19:15:14 359

原创 LeetCode 41 First Missing Positive

题意:求给出的一串数字中的最小的缺失的连续正整数。要求时间复杂度O(n),空间复杂度O(1)。思路:虽然不能排序,但是连续正整数这个性质比较特殊,举例来说:假设扫描数字串的时候遇到一个3,那就把它放在第3个位置。那么当把所有的数字都放好之后,从前到后扫描数字串,最先断开的地方就是答案。代码:class Solution {public: int fir

2017-05-24 18:11:40 189

原创 LeetCode 40 Combination Sum II

题意:集合中的每个数字只能使用一次,求出所有数字和为target的方案。思路:如果把集合中的数字计数,问题会变得和 http://blog.csdn.net/houserabbit/article/details/72677176 几乎一致。我的方法思路与计数思路几乎一致,只不过我没有合并数字,而是枚举每种数字个数的时候只取排在后面的数字,这样就保证了方案不重复。

2017-05-24 16:25:09 236

原创 LeetCode 39 Combination Sum

题意:数字集合中的每个数字可以使用无限次,求出所有的数字和为给定target的方案。思路:如果target小的话,可以当成完全背包问题来处理,但是target数值可能很大,所以干脆就搜索吧= =从大到小的搜索集合中的数字并枚举使用次数。代码:class Solution {public: vector> combinationSum(vector

2017-05-24 16:07:42 223

原创 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 232

原创 LeetCode 37 Sudoku Solver

题意:给出一个一定有解的填了一部分的数独,要求填满它。思路:我是分2步解决这个问题的:第1步检查每个格子可能填哪几个数字,第2步dfs搜索结果。dfs的时候只搜索第1步中找出的可能的数字,每次尝试填入一个格子并更新当前行、当前列、当前3*3格子的可选数字,注意回溯。我的代码3ms就可以跑完,效率还是很不错的。代码:class Solution {p

2017-05-24 14:49:21 215

原创 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 268

原创 LeetCode 35 Search Insert Position

题意:找出target应该插入有序序列中的哪个位置思路:C++的lower_bound使用教学 =。=代码:class Solution {public: int searchInsert(vector &nums, int target) { return lower_bound(nums.begin(), nums.end(), t

2017-02-16 16:39:17 213

原创 LeetCode 34 Search for a Range

题意:给出有序序列,查找target在序列中出现的下标区间。思路:熟练使用C++的upper_bound和lower_bound……代码:class Solution {public: vector searchRange(vector &nums, int target) { int l = lower_bound(nums.begi

2017-02-16 16:36:39 229

原创 LeetCode 33 Search in Rotated Sorted Array

题意:一个数字环,它里面的数字是递增排序的,现在从任意位置把它截断成序列,问target是否在环中出现。思路:一定能想到二分查找,但是这个序列并不是有序的。不过我们仍然可以创造一种二分的方式,毕竟二分的精髓是每次丢掉一般的候选集合。方法如下:1.如果当前区间的中间值是答案,则找到答案。2.如果当前区间是递增的,那么和平时我们写的二分查找就一样了。不详细展开了。3.中

2017-02-16 16:30:04 253

原创 LeetCode 32 Longest Valid Parentheses

题意:求最长的合法的括号匹配的串长度。思路:如果把'('看做+1')'看做-1的话,一个合法的括号匹配序列表示成前缀和应该是+++0+++++0这种样子,其中+表示前缀和>0。为了避免串的最后一部分出现+++0+++++0++++这种情况,我们可以正反扫两次序列。扫的过程就是维护一个sum表示前缀和,一个left表示当前合法序列的起点,每次sum时间复杂度O(n),

2017-02-16 16:20:04 225

原创 LeetCode 31 Next Permutation

题意:给出一串数字,求该排列的下一个排列。如果该排列为字典序最大排列,则输出字典序最小排列。思路:首先C++里面有求下一个排列的函数next_permutation,该函数返回0即表示当前排列字典序最大。如果要自己动手实现,那么就考虑“如何找到比当前排列大1的排列”。假设排列A(aaaXddd)比排列B(aaaYfff)大1,a部分为两排列相同部分,X与Y表示最靠左边不

2017-02-16 16:08:50 269

原创 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 216

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除