随笔分类 - leetcode
摘要:解题思路 采用动态规划思路。参考题解。 核心代码如下: const long long mod = 1e9 + 7; class Solution { public: int numTilings(int n) { vector<vector<long long>> dp(n + 1, vector
阅读全文
摘要:解题思路 直接模拟。将字符串分为两半,分别遍历统计各元音出现的次数,最后比较是否相等即可。 核心代码如下: bool halvesAreAlike(string s) { string a = s.substr(0, s.size() / 2); string b = s.substr(s.size
阅读全文
摘要:解题思路 想到最短路径问题,自然想到用BFS解决问题,但是只记录位置还不够,还需要记录当前拥有的钥匙状态。 需要的数据结构 钥匙的个数是$1-6$,用一个二进制数表示钥匙的状态,第$i$位表示钥匙已经获取到。 队列q记录当前位置以及拥有钥匙的状态,(i,j,state),$state$的第$i$位为
阅读全文
摘要:解题思路 grid中的每个位置$(i,j)$,以该位置为中心的最大加号标志的阶数定义为dp[i][j],则最终返回结果就是所有dp[i][j]中的最大值。 对于每个$(i,j)$,最大阶数不会超过上下左右四个方向的连续的1的个数。首先计算出每个位置四个方向上的连续1的个数,然后遍历所有的$(i,j)
阅读全文
摘要:解题思路 采用位运算的思路不太好理解。但思想就是根据allowed建立一个$mask$,遍历words中的每个元素的每个字符c,查看$mask$的值是否为真。 如果存在就返回结果加一。 如果不存在就退出当前字符串的遍历,转向words中的下一个字符串。 核心代码如下: int countConsis
阅读全文
摘要:解题思路 题目给出字符串s为某些原始坐标字符串去掉所有逗号,小数点和空格后得到的字符串,其中需要满足原始坐标表示中的数不会存在多余的零。 现在我们要求出所有能生成字符串s的所有可能的原始字符串。 我们可以尝试将原始坐标字符串中去掉的逗号,小数点和空格进行还原——首先在字符串s中枚举添加逗号和空格的位
阅读全文
摘要:解题思路 遍历字符串command: 如果当前第i个字符为G,直接在返回结果中添加字符G。 如果当前第i个字符为(,有两种情况: 第i+1个字符为),转化为o. 第i+1个字符为a,则当前字符串会是(al),转化为al. 遍历结束后,返回结果即可。 核心代码如下: class Solution {
阅读全文
摘要:解题思路 看到表达式求解,自然想到栈。 从左至右遍历布尔表达式expression,对于不同类型字符,进行不同操作: 逗号,,跳过该字符; 不是逗号,和右括号),入栈; 如果是右括号),则一个表达式遍历结束,需要解析该表达式的值,并将结果入栈 出栈,直到栈顶元素是左括号(,然后将左括号(和运算符出栈
阅读全文
摘要:##解题思路 1+2+3+4+5+6=15,而1+2-3+4+5+6=9,对于同样的累加,一个数字符号相反,结果少了2*A,这是一条规律。 当移动的总距离num刚好等于target时,返回移动的次数就可以了。 对于负的target,可以取绝对值,当移动的总距离num等于target,且num-tar
阅读全文
摘要:##解题思路 题目条件字符串长度不超过100,直接从大到小枚举word的重复次数k,判断word重复次数后是否还是sequence的字串,是就直接返回重复次数k。 核心代码如下: class Solution { public: int maxRepeating(string sequence, s
阅读全文
摘要:解题思路 ###第一种:暴力枚举 题目给出坐标的范围是[0,50],可以直接枚举所有坐标点(i,j),计算每个坐标点的信号强度,然后找出信号强度最大的坐标点。 核心代码如下: class Solution { public: vector<int> bestCoordinate(vector<vec
阅读全文
摘要:###解题思路 输入是两个字符串数组,包含的元素数目不一定相同,每个元素包含的字符数目也不一定相同。使用两个指针p和i分别记录遍历的元素位置和字符位置。 指针p1和p2分别表示遍历到了word1[p1]和word2[p2],指针i和j分别表示遍历到了word1[p1][i]和word2[p2][j]
阅读全文
摘要:解题思路 根据题意,我们可以把 ss 看成是由「11 组」和「22 组」交替组成的,重点在于每组内的数字是一个还是两个,这可以从 ss 自身上知道。 构造到 ss 的长度达到 nn 时停止。 注意最后一次构造可能会填入两个数,导致 ss 的长度为 n+1n+1,因此最后统计 11 的个数时,应统计
阅读全文
摘要:##解题思路 使用回溯法。从左往右依次遍历字符,当遍历到字符串s的第i个字符c时: 如果c为一个数字,继续检测下一个字符。 如果c为一个字母,将其进行大小写转换,然后往后继续遍历;完成改写形式的子状态遍历后,将c进行恢复,继续往后遍历。 完成当前字符串的遍历后,表示当前的子状态已经遍历完,该序列称为
阅读全文
摘要:###解题思路 根据题意进行模拟即可,利用哈希表把输入的ruleKey转换为items[i]的下标,然后再遍历一遍items,找出符合条件的物品数量。 代码如下: class Solution { public: int countMatches(vector<vector<string>>& it
阅读全文
摘要:###解题思路 既然我们不能先遍历区间,然后找最小值,那么我们不如顺序倒过来,对于每个值,我们找有多少区间里面,它是最小值。 对于一个数字 A[i] 来说,如果在某个区间 [j, k] 里面它是最小值,那么 [j, k] 包含 A[i] 的子数组的最小值也一定是 A[i] 。所以我们只需要找出最大的
阅读全文
摘要:##解题思路 一个数组所有元素的乘积为正返回1,为零返回0,为负返回-1. 变量pos统计正元素的个数,变量neg统计负元素的个数,遍历数组。 遍历过程中如果有元素为零,直接返回0;遍历结束后,计算neg的个数,奇数就说明所有元素乘积为负,返回-1,否则返回1。 核心代码如下: class Solu
阅读全文
摘要:##解题思路 ###前缀和 定义前缀和$s[0] = 0$, $s[i+1] = \displaystyle\sum\limits_{j=0}^i nums[j]$。 例如 $nums=[1,2,-1,2]$,对应的前缀和数组为$s=[0,1,3,2,4]$。 通过前缀和,可以将子数组和转换为两个前
阅读全文
摘要:解题思路 由于0代表水域,1代表陆地,我们要区分两个岛屿,所以,在遍历grid矩阵的时候,只要第一次发现了某个格子为1,则开始将发现的新大陆进行编号,即将1变为2。在此过程中,我们采用深度遍历的方式寻找整个岛,在深度遍历的过程中,如果我们发现了某个格子为0,则说明我们已经遍历到了岛屿的边缘部分,则将
阅读全文
摘要:解题思路 最终的是将一个数组分为两个数组:左数组和右数组。这两个数组满足: 左数组的最大值小于右数组的任何值。需要一个变量left_max来记录左数组的最大值。 左数组长度尽可能小。使用变量idx记录满足条件的数组位置。 **左数组右边的值较小,则右边该值一定会划分到左数组。**此时需要更新idx的
阅读全文