慢刷Leetcode算法题
|
预计 11 min read
2024-06-24
Ideas
- mergeTrees方法:
- 如果
root1
或root2
为null
,直接返回另一棵树。 - 否则,先将
root1
和root2
对应节点的值相加,并将结果存储在root1
中。 - 递归地合并左子树和右子树。
- 如果
503. 下一个更大元素 II
Ideas
- 初始化:
- 创建一个
result
数组,初始值全部设为-1
,表示如果某个元素没有找到下一个更大元素,则默认值为-1
。 - 创建一个栈
stack
用于存储元素的索引。
- 创建一个
- 遍历数组:
- 使用
for
循环遍历2 * n
次,利用i % n
模拟循环数组。 - 每次从
nums
数组中取出当前元素num
。
- 使用
- 更新结果数组:
- 使用
while
循环,当栈不为空且当前元素num
大于栈顶元素对应的元素时,更新结果数组中栈顶元素对应的下一个更大元素为当前元素,并弹出栈顶。
- 使用
- 压入栈:
- 如果当前索引
i
小于数组长度n
,则将当前索引压入栈中。
- 如果当前索引
2024-06-23
456. 132 模式
Ideas
- 初始化一个空栈和一个
third
变量为Integer.MIN_VALUE
。 - 从后往前遍历数组:
- 如果
nums[i] < third
,说明存在132
模式的子序列,返回true
。 - 如果
nums[i] > stack.peek()
,不断弹出栈顶元素并更新third
,直到栈顶元素不再小于当前元素。 - 将当前元素压入栈。
- 如果
- 如果遍历完数组后没有找到符合条件的子序列,返回
false
。
- 时间复杂度: O(n)。每个元素最多被压入和弹出栈一次,因此总时间复杂度是线性的。
- 空间复杂度: O(n)。在最坏情况下(严格递增的序列),栈需要存储所有的元素。
520. 检测大写字母
Ideas
-
首先检查单词是否为空或只有一个字符,如果是,直接返回
true
。 -
使用
equals
方法检查整个单词是否全部大写或全部小写。 -
使用
Character.isUpperCase
方法检查首字母是否大写,然后使用substring
和equals
方法检查剩余部分是否全部小写。 -
如果都不符合,返回
false
。
- 时间复杂度: O(n),其中 n 是字符串的长度。
- 空间复杂度: O(n),主要来自于字符串操作
toUpperCase()
和toLowerCase()
519. 随机翻转矩阵
Ideas
1: 初始化和数据表示
- 使用一个字典
map
记录已经翻转的坐标(避免使用额外的二维数组)。 - 使用一个变量
total
记录剩余可翻转的位置数量。
2: 执行 flip
操作
- 使用随机数生成器在剩余可翻转的位置中选取一个随机下标
x
。 - 判断下标
x
是否已经被翻转过:- 如果已被翻转,使用映射字典找到当前
x
实际对应的位置。
- 如果已被翻转,使用映射字典找到当前
- 更新映射字典,将当前
x
位置映射到末尾(减少多次随机选择重复位置)。 - 返回二维矩阵中的对应坐标
[i, j]
。
3: 重置操作
- 清空映射字典,并将
total
重置为m * n
。
2024-06-21
LCP 61. 气温变化趋势
Ideas
-
计算气温变化趋势:对于每个地区,计算每一天与下一天的气温变化趋势。我们可以用一个数组来存储这些变化趋势。
-
比较两个地区的气温变化趋势:遍历两个变化趋势数组,找到连续相同的最大天数。
思考
随着不断深入学习,发现算法才是代码的唯一解,或者说是他的最优解。从而我开始逐步的进行力扣的刷题之路。
随着公司压力的逐渐增大,我所承担的任务在难度和复杂度上都明显高于同组其他任务。然而,我并未获得应有的激励
和奖励
,这让我开始思考这份工作的付出与收益是否值得,于是我开始有了以快速提升自己从而得到更高的回报的内容。
评论