今天浏览掘金的时候无意中发现顶部有个 AI辅助刷题的功能,所以就来尝试了一下。支持的语言比较丰富,主流的除了php基本都有,还有个debug功能,目测类似IDE里的调试工具,目前还在研究中,大家可以自己尝试尝试。
题目看着都不简单,刷习惯了leetcode的话看这边的题目需要适应一下,我调了一个寻找最大数的题目,题目描述比较好理解,不过我看它是支持导入自定义的题目的,这点比较人性化了,大家可以把喜欢的题库导入进来配合AI提示刷刷题。
最后附上我昨的题目和答案:
问题描述
对于一个有 N 个元素的数组,包含如下的元素 a1, a2, ..., an,我们定义了两个函数:
-
L(i) = j 需要满足的条件如下:
- j < i
- a[j] > a[i]
- 如果找不到 j 的话,那么 L(i) = 0;如果有多个 j 的话,选择离 i 最近的那一个
-
R(i) = k 需要满足的条件如下:
- k > i
- a[k] > a[i]
- 如果找不到 k 的话,那么 R(i) = 0;如果有多个 k 的话,选择离 i 最近的那一个
最后,我们定义 MAX(i) = L(i) * R(i),我们需要找到 MAX(i) 的最大值,其中 1 <= i <= N。
输入格式
总共有两行,第一行是数组长度 N,第二个是空格分割的所有数组的内容。
输出格式
输出 MAX(i) 的最大值。
输入样例
5
5 4 3 4 5
输出样例
8
解释说明
- L(1) = 0,所以 MAX(1) = 0
- L(2) = 1, R(2) = 5,所以 MAX(2) = 1 * 5 = 5
- L(3) = 2, R(3) = 4,所以 MAX(3) = 2 * 4 = 8
- L(4) = 1, R(4) = 5,所以 MAX(4) = 1 * 5 = 5
- R(5) = 0,所以 MAX(5) = 0
数据范围
答案:
function solution(N, array) {
// 步骤1:计算 L(i)
const L = new Array(N).fill(0); // 创建数组 L 并初始化为 0
const stackL = []; // 创建栈用于存放索引
// 从左到右遍历数组
for (let i = 0; i < N; i++) {
// 维护栈,找出满足条件的最近的 j
while (stackL.length && array[stackL[stackL.length - 1]] <= array[i]) {
stackL.pop(); // 弹出不符合条件的索引
}
// 如果栈不为空,则取栈顶元素,计算 L(i)
if (stackL.length) {
L[i] = stackL[stackL.length - 1] + 1; // +1 转换为 1-based 索引
} else {
L[i] = 0; // 找不到符合条件的 j
}
stackL.push(i); // 将当前索引压入栈中
}
// 步骤2:计算 R(i)
const R = new Array(N).fill(0); // 创建数组 R 并初始化为 0
const stackR = []; // 创建栈用于存放索引
// 从右到左遍历数组
for (let i = N - 1; i >= 0; i--) {
// 维护栈,找出满足条件的最近的 k
while (stackR.length && array[stackR[stackR.length - 1]] <= array[i]) {
stackR.pop(); // 弹出不符合条件的索引
}
// 如果栈不为空,则取栈顶元素,计算 R(i)
if (stackR.length) {
R[i] = stackR[stackR.length - 1] + 1; // +1 转换为 1-based 索引
} else {
R[i] = 0; // 找不到符合条件的 k
}
stackR.push(i); // 将当前索引压入栈中
}
// 步骤3:计算 MAX(i)
let maxProduct = 0; // 初始化最大乘积
for (let i = 0; i < N; i++) {
maxProduct = Math.max(maxProduct, L[i] * R[i]); // 更新最大乘积
}
return maxProduct; // 返回最大乘积
}
function main() {
// Add your test cases here
console.log(solution(5, [5, 4, 3, 4, 5]) === 8);
}
main();