LeetCode刷题笔记
目录
1937.扣分后的最大分
思路:动态规划
1.先遍历出points数组的第一行,放入dp数组,因为第一行不需要通过上面的计算结果来求最大值。
2.如果dp数组挨个去加当前行的每一列,再求最大值,则肯定超时。
3.所以对于当前行的当前列points[i][j],我们可以求出Math.max(max - 1,dp[i - 1][j]),其中max为i - 1行中,j这一列前面的列的最大值,我们从j = 0开始,总是能求出max的值,max - 1即为所求的前缀,最大值,然后通过前缀最大值和dp[i - 1][j]比较。
4.考虑到i - 1这一行,有可能最大值出现在后缀列,所以通过同样的方法,我们求出后缀列与dp[i - 1][j]作比较,同时与前缀列的dp[i][j]作比较。。
代码:
LLONG_MIN:long long的最小值
move():状态转移
max_element():algorithm库中的函数,用于求[first,last)迭代器中的最大值,返回值是一个迭代器,需要解引用获得其值。
1483.树节点的第K个祖先
思路:
倍增的思路类似于动态规划,定义 ancestors[i][j] 表示节点 i 的第 2 的j次方个祖先。此题中,树最多有 50000 个节点,因此 ancestors 的第二维度的最大值可以设为 16。根据定义,ancestors[i][0]=parent[i]。状态转移方程是 ancestors[i][j]=ancestors[ancestors[i][j−1]][j−1],即当前节点的第 个祖先的第 2的j−1次方个祖先。当第 2 的j次方个祖先不存在时,记为 −1。查询时,需要将 k 的二进制表示从最低位到最高位依次进行判断,如果第 j 位为 1,则节点 node 需要进行转移到 ancestors[node][j],表示 node向祖先方向移动了 2的j次方次。直至遍历完 k 所有位或者 node 变为 −1。
代码:
709.转换成小写字母
思路:枚举
遍历每一个字母,判断是否是大写字母,是大写字母,转化为小写字母。
/* 位运算(解题区的思路
大写变小写、小写变大写 : 字符 ^= 32;
大写变小写、小写变小写 : 字符 |= 32;
小写变大写、大写变大写 : 字符 &= -33;
eg:
65(A)->二进制表示为100 0001
32的二进制表示为 010 0000
100 0001|010 0000=110 0001->97(a)
*/
代码:
- 点赞
- 收藏
- 关注作者




评论(0)