随笔分类 - LeetCode
LeetCode题解
摘要:这题是要实现Linux里的类似pwd命令的功能,给出一串绝对地址,绝对地址里每两个"/"之间可能含有".","..","",/等, 这些特殊情况都需要判断。 思路是,遍历path字符串,对于每两个"/"之间的字符串temp,根据字符串内容考虑是否要压入一个额外的string数组strs中。 strs
阅读全文
摘要:由于每次只能跳一阶或者两阶台阶,所以要到达每一阶台阶的方案数都是到达上一阶台阶的方案数 和到达上上阶台阶的方案数之和。 如果我们用dp[i]表示到达第i阶台阶的方案数,那么可以得到递推公式dp[i] = dp[i - 1] + dp[i - 2]; 这就是一个斐波那契数列,递推边界是dp[0] =
阅读全文
摘要:这题是要用二分寻找一个数的平方根的整数部分。 当然顺序搜索也是可以的,但是由于搜索范围1 ~ sqrt(x)是有序的,所以显然可以用二分搜索。 这题由于是返回整数部分,所以二分的判断稍微要多写几行,如果一个数pow(mid, 2) < x, 但pow(mid + 1, 2) > x,这种情况下是返回
阅读全文
摘要:这题是一道模拟题,需要我们模拟word等文本编辑器都有的一个文本自动对齐功能。 从测试样例可以看出,文本对齐有三种情况需要判断: **1. 如果某行只含有一个字符串,这时只需要左对齐。**比如某行可以放下100个字符,某单词长度98个字符, 这时不需要把这个单词左右对齐,让单词居中左右各一个空格,实
阅读全文
摘要:开两个栈helper和Queue来模拟队列,helper用来中转元素,Queue存放倒序(与元素入队顺序相反)的元素。 这样pop()的时候就相当于最先进入“队列”的元素出队。 举个例子:最开始有四个元素1, 2, 3, 4要入队,由于我们只有栈,我们希望在栈Queue中存放的顺序是4, 3, 2,
阅读全文
摘要:模仿十进制进位写二进制进位。 class Solution { public: string addBinary(string a, string b) { string res; reverse(a.begin(), a.end()); reverse(b.begin(), b.end()); f
阅读全文
摘要:用一个数组记录各个位数的变化,通过低位+1,观察各个位数的变化。 注意一下如果最高位因为进位导致多了一位,需要将进位(只可能是1 push_back()进数组) class Solution { public: vector<int> plusOne(vector<int>& digits) { r
阅读全文
摘要:这题完美的诠释了什么叫“面向测试用例编程”。由于要考虑的情况很多,所以基本的思路是先根据给出的测试用例写出规则判断无效的情况,然后再根据提交的错误对剩下的情况进行特判,如果不满足所有“无效的情况”,则有效。题目特别提了“我们有意将问题陈述地比较模糊”,这个“有意地陈述地模糊”就很灵性,所以一开始很难
阅读全文
摘要:这题和62题以及63题类似,只不过dp数组的状态表示变了,这里dp数组不再表示方案数,而是到当前格子的最小路径和。可以发现:要到达第i行第j列的格子,只有从第i - 1行第j列的格子或第i行第j - 1列的格子加上到第i行第j列的格子需要的代价(grid[i][j])得到,所以如果要得到到第i行第j
阅读全文
摘要:这题和62题类似,只不过这里多了障碍物,只需要把有障碍物的格子的方案数设置为0即可,其他格子还是原来的走法。 class Solution { public: int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) { int
阅读全文
摘要:由于机器人只可以向右和向下移动,所以我们要到第i行第j列,只可以由第i-1行第j列和第i行第j-1列移动一步得到,因此要到第i行第j列的方案数就是到第i-1行第j列的方案数和到第i行第j-1列的方案数之和。如果用dp[i][j]表示到第i行第j列的方案数,我们可以得到状态转移方程:dp[i][j]
阅读全文
摘要:方法一 暴力枚举所有可能的子数组,也就是枚举子数组的所有开始下标和结束下标,计算子数组的和,如果子数组的和小于等于s,就更新最小长度。 class Solution { public: int minSubArrayLen(int s, vector<int>& nums) { if(nums.si
阅读全文
摘要:第一题 用一个新数组newSalary保存去掉最低和最高工资的工资列表,然后遍历newSalary,计算总和,除以元素个数,就得到了平均值。 class Solution { public: double average(vector<int>& salary) { sort(salary.begi
阅读全文
摘要:要将链表向右移动 k 次,可以将链表分为两部分:不移动部分和移动部分。 不移动部分就是链表前 size - k 个结点(size为链表结点个数),移动部分就是链表后 k 个结点。 对于移动部分的 k 个结点,需要将第一个结点置为新的 head 结点,并且移动部分的最后一个节点的 next 指针指向不
阅读全文
摘要:解法一:用next_permutation()函数,要求第k个排列,就从"123...n"开始调用 k - 1 次 next_permutation()函数即可。 class Solution { public: string getPermutation(int n, int k) { strin
阅读全文
摘要:这题和第54题类似,都是套一个搜索的模板。 用dx和dy表示方向,方向的顺序是先向右,再向下,再向左,再向上,再向右。。。 如果“撞墙”了就需要改变到下一个方向。“撞墙”的判定就是(newX, newY)越界或者已经被访问过。 “撞墙”就需要改变方向,即更新(newX, newY)。 class S
阅读全文
摘要:翻转整个字符串,再用双指针分隔出第一个单词。 注意左指针要先过滤掉前缀的空格,右指针从左指针的位置开始逐渐增加,直到右指针指向空格。 第一个单词的长度就是左右指针的距离之差。 class Solution { public: int lengthOfLastWord(string s) { if(s
阅读全文
摘要:对于新插入的区间newInterval,原区间列表intervals可以分为三个部分: 左边与newInterval不重合的区间,这些区间直接加入结果数组中; 中间与newInterval重合的区间,我们需要更新newInterval的左右端点,使得左右端点分别为重合部分的最左和最右; 右边与new
阅读全文
摘要:先把区间按照左端点排序,这样排完序之后的列表中的可以合并的区间就都是连续的了。 将列表中第一个区间(最左的区间)加入到结果数组res中,并按顺序依次考虑之后的每个区间: 如果当前区间的左端点大于res数组末尾区间的右端点,则当前区间去前面的区间不重合,直接将这个区间加入res数组中; 否则,表示当前
阅读全文
摘要:这题是典型的贪心。 我们用一个变量canReach表示最远能到达的距离,canReach的初始值为0。 遍历数组,当遍历到位置x时,如果x小于等于canReach,说明当前位置可以从起点经过若干步跳跃到达, 因此我们可以用canReach = max(canReach, x + nums[x])更新
阅读全文