华为OD机试真题——阿里巴巴找黄金宝箱 IV(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

在这里插入图片描述

2025 A卷 200分 题型

本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析;
并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式!

华为OD机试真题《阿里巴巴找黄金宝箱 IV》:


目录

    • 题目名称:阿里巴巴找黄金宝箱 IV
      • 题目描述
    • Java
      • 题目分析
      • 解决思路
      • Java 代码实现
      • 代码解析
      • 示例测试
        • 示例1:
        • 示例2:
      • 综合分析
    • python
      • 题目分析
      • 解决思路
      • Python 代码实现
      • 代码解析
      • 示例测试
        • 示例1:
        • 示例2:
      • 综合分析
    • JavaScript
      • 题目分析
      • 解决思路
      • JavaScript 代码实现
      • 代码解析
      • 示例测试
        • 示例1:
        • 示例2:
      • 综合分析
    • C++
      • 题目分析
      • 解决思路
      • C++ 代码实现
      • 代码解析
      • 示例测试
        • 示例1:
        • 示例2:
      • 综合分析
    • C语言
      • 题目分析
      • 解决思路
      • C 代码实现
      • 代码解析
        • 1. 栈结构定义
        • 2. 栈操作函数
        • 3. 核心算法
        • 4. 输入处理
      • 示例测试
        • 示例1:
        • 示例2:
      • 综合分析
    • GO
      • 题目分析
      • 解决思路
      • Go 代码实现
      • 代码解析
      • 示例测试
        • 示例1:
        • 示例2:
      • 综合分析
    • 更多内容:


题目名称:阿里巴巴找黄金宝箱 IV


知识点: 字符串、栈操作(单调栈算法)、逻辑处理
时间限制: 1秒
空间限制: 256MB
限定语言: 不限


题目描述

一贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地。藏宝地有编号从0-N的箱子排列成环(编号最大的箱子的下一个是编号为0的箱子),每个箱子贴有一个数字。请输出每个箱子之后的第一个比它大的数字,若不存在则输出-1。

输入描述
输入一个数字子串,数字之间用逗号分隔,例如:1,2,3,1

  • 1 ≤ 子串中数字个数 ≤ 10000
  • -100000 ≤ 每个数字值 ≤ 100000

输出描述
结果以逗号分隔,例如:2,3,6,-1,6

测试用例

  1. 输入:1,2,3,4,5 → 输出:2,3,4,5,-1
  2. 输入:2,5,2 → 输出:5,-1,5(需循环搜索)

Java

题目分析

我们需要在给定的环形数组中,为每个元素找到其后第一个更大的元素。环形数组意味着最后一个元素的下一个元素是第一个元素。例如,输入 2,5,2 中,第三个元素的下一个元素是第一个元素,但第一个更大的元素是第二个元素 5。


解决思路

单调栈算法

  1. 遍历两次数组:模拟环形结构,每个元素会被处理两次。
  2. 维护单调递减栈:栈中保存元素索引,确保栈顶元素对应的值是递减的。
  3. 处理每个元素:当当前元素比栈顶元素大时,栈顶元素的下一个更大元素即为当前元素,记录结果并出栈。

Java 代码实现

import java.util.*;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String input = scanner.nextLine();String[] parts = input.split(",");int[] nums = new int[parts.length];for (int i = 0; i < parts.length; i++) {nums[i] = Integer.parseInt(parts[i]);}int[] result = nextGreaterElements(nums);System.out.println(arrayToString(result));}private static int[] nextGreaterElements(int[] nums) {int n = nums.length;int[] res = new int[n];Arrays.fill(res, -1);Deque<Integer> stack = new ArrayDeque<>();// 遍历两次数组,模拟环形结构for (int i = 0; i < 2 * n; i++) {int num = nums[i % n];// 维护单调递减栈,处理栈顶元素while (!stack.isEmpty() && num > nums[stack.peek()]) {int index = stack.pop();res[index] = num;}// 只在第一次遍历时压入索引if (i < n) {stack.push(i);}}return res;}private static String arrayToString(int[] arr) {StringBuilder sb = new StringBuilder();for (int i = 0; i < arr.length; i++) {if (i > 0) {sb.append(",");}sb.append(arr[i]);}return sb.toString();}
}

代码解析

  1. 输入处理

    String input = scanner.nextLine();
    String[] parts = input.split(",");
    int[] nums = new int[parts.length];
    for (int i = 0; i < parts.length; i++) {nums[i] = Integer.parseInt(parts[i]);
    }
    
    • 读取输入字符串并分割为整数数组。
  2. 核心算法 nextGreaterElements

    int[] res = new int[n];
    Arrays.fill(res, -1);
    Deque<Integer> stack = new ArrayDeque<>();
    
    • 初始化结果数组 res,默认值为 -1。
    • 使用双端队列 Deque 作为栈,保存索引。
  3. 遍历两次数组

    for (int i = 0; i < 2 * n; i++) {int num = nums[i % n];while (!stack.isEmpty() && num > nums[stack.peek()]) {int index = stack.pop();res[index] = num;}if (i < n) {stack.push(i);}
    }
    
    • 遍历逻辑:遍历 2n 次,i % n 模拟环形访问。
    • 维护栈:栈中保存未找到更大元素的索引,确保栈中元素对应的值是递减的。
    • 处理栈顶元素:当当前元素 num 大于栈顶元素对应的值时,栈顶元素的下一个更大元素即为 num,记录结果并出栈。
    • 压入索引:仅在第一次遍历时压入索引,避免重复处理。
  4. 结果转换

    private static String arrayToString(int[] arr) {// 将数组转换为逗号分隔的字符串
    }
    
    • 将结果数组转换为题目要求的输出格式。

示例测试

示例1:

输入

1,2,3,4,5

输出

2,3,4,5,-1

解析

  • 每个元素的下一个更大元素依次为后一个元素,最后一个元素无更大值。
示例2:

输入

2,5,2

输出

5,-1,5

解析

  • 第一个 2 的下一个更大元素是 5。
  • 5 之后没有更大元素。
  • 最后一个 2 的下一个更大元素是循环后的 5。

综合分析

  1. 时间复杂度 O(n):每个元素最多入栈和出栈两次,总操作次数为 4n,仍为线性复杂度。
  2. 空间复杂度 O(n):栈和结果数组的空间均为 O(n)
  3. 正确性保证
    • 环形处理:通过遍历两次数组,确保每个元素能访问到环形后的元素。
    • 单调栈特性:确保每个元素找到第一个更大元素。
  4. 适用场景:高效处理大规模数据(n ≤ 10000)。

python

题目分析

给定一个环形数组,每个元素需要找到其后的第一个更大元素。若不存在更大元素则输出 -1。例如:

  • 输入 2,5,2 的输出为 5,-1,5,最后一个元素循环到开头找到更大值。
  • 输入 1,2,3,4,5 的输出为 2,3,4,5,-1

解决思路

单调栈算法

  1. 遍历两次数组:模拟环形结构,每个元素处理两次。
  2. 维护单调递减栈:栈中保存元素索引,确保栈顶元素对应的值是递减的。
  3. 处理当前元素:若当前元素比栈顶元素大,则栈顶元素的下一个更大元素即为当前元素。

Python 代码实现

def next_greater_elements(nums):n = len(nums)res = [-1] * n  # 初始化结果数组,默认-1stack = []  # 单调递减栈,保存索引# 遍历两倍数组长度,模拟环形结构for i in range(2 * n):current_num = nums[i % n]  # 当前元素(环形取模)# 维护单调栈:当前元素比栈顶元素大时,更新结果while stack and current_num > nums[stack[-1]]:index = stack.pop()  # 弹出栈顶索引res[index] = current_num  # 记录下一个更大元素# 只在第一次遍历时压入索引,避免重复处理if i < n:stack.append(i % n)return res# 输入处理与结果输出
input_str = input().strip()
nums = list(map(int, input_str.split(',')))
result = next_greater_elements(nums)
print(','.join(map(str, result)))

代码解析

  1. 初始化结果数组

    n = len(nums)
    res = [-1] * n
    
    • 创建长度与输入相同的数组,默认值为 -1
  2. 遍历两次数组

    for i in range(2 * n):current_num = nums[i % n]
    
    • i % n 将索引映射到原数组范围,模拟环形结构。
  3. 维护单调递减栈

    while stack and current_num > nums[stack[-1]]:index = stack.pop()res[index] = current_num
    
    • 当当前元素比栈顶元素大时,弹出栈顶并记录结果。
  4. 压入索引

    if i < n:stack.append(i % n)
    
    • 仅在第一次遍历时压入索引,避免重复处理。

示例测试

示例1:

输入

1,2,3,4,5

输出

2,3,4,5,-1

解析

  • 每个元素的下一个更大元素是后一个元素,最后一个元素无更大值。
示例2:

输入

2,5,2

输出

5,-1,5

解析

  • 第一个 2 的下一个更大元素是 5
  • 5 之后没有更大元素。
  • 最后一个 2 循环到开头找到 5

综合分析

  1. 时间复杂度 O(n):每个元素最多入栈和出栈两次,总操作次数为 4n,时间复杂度为线性。
  2. 空间复杂度 O(n):栈和结果数组的空间均为 O(n)
  3. 正确性保障
    • 环形处理:通过遍历两次数组,确保每个元素能访问到环形后的元素。
    • 单调栈特性:栈中保存未找到更大元素的索引,保证找到的是第一个更大值。
  4. 适用场景:高效处理大规模数据(n ≤ 10000)。

JavaScript

题目分析

给定一个环形数组,每个元素需要找到其后第一个更大的元素。若不存在,则返回 -1。例如:

  • 输入 2,5,2 的输出为 5,-1,5,最后一个元素在循环中找到更大的 5
  • 输入 1,2,3,4,5 的输出为 2,3,4,5,-1

解决思路

单调栈算法

  1. 遍历两次数组:模拟环形结构,确保每个元素处理两次。
  2. 维护单调递减栈:栈中保存元素索引,栈顶元素对应的值最小。
  3. 处理当前元素:若当前元素比栈顶元素大,则栈顶元素的下一个更大元素为当前元素。

JavaScript 代码实现

function nextGreaterElements(nums) {const n = nums.length;const result = new Array(n).fill(-1); // 初始化结果数组为-1const stack = []; // 单调栈,保存索引// 遍历两倍数组长度以模拟环形结构for (let i = 0; i < 2 * n; i++) {const currentNum = nums[i % n]; // 当前元素(环形取模)// 维护栈:当前元素比栈顶元素大时,更新结果while (stack.length > 0 && currentNum > nums[stack[stack.length - 1]]) {const index = stack.pop();result[index] = currentNum; // 栈顶元素的下一个更大元素是当前元素}// 仅在第一次遍历时压入索引,避免重复处理if (i < n) {stack.push(i % n);}}return result;
}// 输入处理与结果输出
const input = '2,5,2'; // 示例输入
const nums = input.split(',').map(Number);
const result = nextGreaterElements(nums);
console.log(result.join(',')); // 输出:5,-1,5

代码解析

  1. 初始化结果数组

    const result = new Array(n).fill(-1);
    
    • 创建长度与输入数组相同的数组,默认值为 -1
  2. 遍历两次数组

    for (let i = 0; i < 2 * n; i++) {const currentNum = nums[i % n];
    
    • i % n 将索引映射到原数组范围,模拟环形结构。
  3. 维护单调递减栈

    while (stack.length > 0 && currentNum > nums[stack[stack.length - 1]]) {const index = stack.pop();result[index] = currentNum;
    }
    
    • 当当前元素比栈顶元素大时,弹出栈顶并记录结果。
  4. 压入索引

    if (i < n) {stack.push(i % n);
    }
    
    • 仅在第一次遍历时压入索引,避免重复处理。

示例测试

示例1:

输入

const input = '1,2,3,4,5';

输出

2,3,4,5,-1

解析

  • 每个元素的下一个更大元素是后一个元素,最后一个元素无更大值。
示例2:

输入

const input = '2,5,2';

输出

5,-1,5

解析

  • 第一个 2 的下一个更大元素是 5
  • 5 之后没有更大元素。
  • 最后一个 2 循环到开头找到 5

综合分析

  1. 时间复杂度 O(n):每个元素最多入栈和出栈两次,总操作次数为 4n,时间复杂度为线性。
  2. 空间复杂度 O(n):栈和结果数组的空间均为 O(n)
  3. 正确性保障
    • 环形处理:通过遍历两次数组,确保每个元素能访问到环形后的元素。
    • 单调栈特性:栈中保存未找到更大元素的索引,保证找到的是第一个更大值。
  4. 适用场景:高效处理大规模数据(n ≤ 10000)。

C++

题目分析

给定一个环形数组,每个元素需要找到其后的第一个更大元素。若不存在,则返回 -1。例如:

  • 输入 1,2,3,4,5 的输出为 2,3,4,5,-1
  • 输入 2,5,2 的输出为 5,-1,5

解决思路

单调栈算法

  1. 遍历两次数组:通过取模操作模拟环形数组,确保每个元素的后继元素被检查两次。
  2. 维护单调递减栈:栈中保存元素索引,确保栈顶元素对应的值最小。
  3. 更新结果数组:当当前元素大于栈顶元素时,栈顶元素的下一个更大元素即为当前元素。

C++ 代码实现

#include <iostream>
#include <vector>
#include <stack>
#include <sstream>
#include <string>using namespace std;vector<int> nextGreaterElements(vector<int>& nums) {int n = nums.size();vector<int> res(n, -1);  // 初始化结果数组为-1stack<int> st;           // 单调栈,保存未找到更大元素的索引// 遍历两倍数组长度以模拟环形结构for (int i = 0; i < 2 * n; ++i) {int current = nums[i % n];  // 当前元素(环形取模)// 维护单调栈:当前元素比栈顶元素大时,更新结果while (!st.empty() && current > nums[st.top()]) {int idx = st.top();st.pop();res[idx] = current;  // 记录栈顶索引对应的下一个更大元素}// 仅在第一次遍历时压入索引,避免重复处理if (i < n) {st.push(i % n);}}return res;
}int main() {string input;getline(cin, input);  // 读取输入字符串// 解析输入为整数数组vector<int> nums;stringstream ss(input);string token;while (getline(ss, token, ',')) {nums.push_back(stoi(token));}// 计算下一个更大元素数组vector<int> res = nextGreaterElements(nums);// 输出结果for (int i = 0; i < res.size(); ++i) {if (i != 0) {cout << ",";}cout << res[i];}cout << endl;return 0;
}

代码解析

  1. 结果数组初始化

    vector<int> res(n, -1);
    
    • 创建一个长度为 n 的数组,所有元素初始化为 -1
  2. 遍历两倍数组长度

    for (int i = 0; i < 2 * n; ++i) {int current = nums[i % n];
    
    • 通过 i % n 模拟环形数组,遍历两次原数组。
  3. 维护单调栈

    while (!st.empty() && current > nums[st.top()]) {int idx = st.top();st.pop();res[idx] = current;
    }
    
    • 当前元素比栈顶元素大时,弹出栈顶并更新结果。
  4. 压入索引

    if (i < n) {st.push(i % n);
    }
    
    • 仅在第一次遍历时压入索引,确保每个元素只处理一次。

示例测试

示例1:

输入

1,2,3,4,5

输出

2,3,4,5,-1

解析

  • 每个元素的后一个元素更大,最后一个元素无更大值。
示例2:

输入

2,5,2

输出

5,-1,5

解析

  • 第二个 2 循环到数组开头找到 5 作为下一个更大元素。

综合分析

  1. 时间复杂度 O(n):每个元素最多入栈和出栈两次,总操作次数为 4n,时间复杂度为线性。
  2. 空间复杂度 O(n):栈和结果数组的空间均为 O(n)
  3. 正确性保障
    • 环形处理:通过遍历两次数组,确保每个元素的后继被完整检查。
    • 单调栈特性:确保每个元素找到第一个更大的元素。
  4. 适用场景:高效处理大规模数据(n ≤ 10000)。

C语言

题目分析

给定一个环形数组,每个元素需要找到其后第一个更大的元素。若不存在,则返回 -1。例如:

  • 输入 2,5,2 的输出为 5,-1,5
  • 输入 1,2,3,4,5 的输出为 2,3,4,5,-1

解决思路

单调栈算法

  1. 遍历两次数组:通过取模操作模拟环形结构
  2. 维护单调递减栈:栈中保存元素索引,确保栈顶元素的值最小
  3. 更新结果数组:当当前元素大于栈顶元素时,更新结果

C 代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define INIT_CAPACITY 100  // 栈初始容量// 定义栈结构
typedef struct {int *data;     // 存储索引的数组int top;       // 栈顶指针int capacity;  // 栈容量
} Stack;// 初始化栈
void initStack(Stack *s) {s->data = (int*)malloc(INIT_CAPACITY * sizeof(int));s->top = -1;s->capacity = INIT_CAPACITY;
}// 扩展栈容量
void resizeStack(Stack *s) {s->capacity *= 2;s->data = (int*)realloc(s->data, s->capacity * sizeof(int));
}// 压栈操作
void push(Stack *s, int val) {if (s->top == s->capacity - 1) resizeStack(s);s->data[++s->top] = val;
}// 弹栈操作
int pop(Stack *s) {return s->data[s->top--];
}// 获取栈顶元素
int top(Stack *s) {return s->data[s->top];
}// 判断栈是否为空
int isEmpty(Stack *s) {return s->top == -1;
}// 释放栈内存
void freeStack(Stack *s) {free(s->data);
}// 核心算法函数
int* nextGreaterElements(int* nums, int numsSize, int* returnSize) {int* res = (int*)malloc(numsSize * sizeof(int));*returnSize = numsSize;memset(res, -1, numsSize * sizeof(int));  // 初始化结果数组Stack s;initStack(&s);// 遍历两倍数组长度模拟环形for (int i = 0; i < 2 * numsSize; i++) {int current = nums[i % numsSize];// 维护单调栈while (!isEmpty(&s) && current > nums[top(&s)]) {int idx = pop(&s);res[idx] = current;}// 只压入第一次遍历的索引if (i < numsSize) {push(&s, i % numsSize);}}freeStack(&s);return res;
}// 字符串分割函数
int* parseInput(const char* input, int* size) {char* str = strdup(input);int count = 0;char* token = strtok(str, ",");int* arr = NULL;while (token) {arr = (int*)realloc(arr, (count + 1) * sizeof(int));arr[count++] = atoi(token);token = strtok(NULL, ",");}*size = count;free(str);return arr;
}int main() {char input[100000];fgets(input, sizeof(input), stdin);input[strcspn(input, "\n")] = '\0';  // 去除换行符int numsSize;int* nums = parseInput(input, &numsSize);int returnSize;int* res = nextGreaterElements(nums, numsSize, &returnSize);// 输出结果for (int i = 0; i < returnSize; i++) {if (i > 0) printf(",");printf("%d", res[i]);}free(nums);free(res);return 0;
}

代码解析

1. 栈结构定义
typedef struct {int *data;     // 存储索引的数组int top;       // 栈顶指针int capacity;  // 栈容量
} Stack;
  • 使用动态数组实现栈,支持自动扩容
2. 栈操作函数
void push(Stack *s, int val) {if (s->top == s->capacity - 1) resizeStack(s);s->data[++s->top] = val;
}
  • 压栈时自动检查容量,不足时自动扩容
3. 核心算法
int* nextGreaterElements(int* nums, int numsSize, int* returnSize) {int* res = (int*)malloc(numsSize * sizeof(int));memset(res, -1, numsSize * sizeof(int));Stack s;initStack(&s);for (int i = 0; i < 2 * numsSize; i++) {int current = nums[i % numsSize];while (!isEmpty(&s) && current > nums[top(&s)]) {int idx = pop(&s);res[idx] = current;}if (i < numsSize) push(&s, i % numsSize);}freeStack(&s);return res;
}
  • 关键逻辑
    • 遍历 2*n 次模拟环形
    • 维护单调递减栈
    • 只在第一次遍历时压入索引
4. 输入处理
int* parseInput(const char* input, int* size) {char* str = strdup(input);int count = 0;int* arr = NULL;// 使用 strtok 分割字符串
}
  • 动态解析逗号分隔的输入字符串

示例测试

示例1:

输入:

1,2,3,4,5

输出:

2,3,4,5,-1

解析过程:

  • 每个元素的后继即为其下一个更大值
  • 最后一个元素没有更大值
示例2:

输入:

2,5,2

输出:

5,-1,5

解析过程:

  • 第一个 2 找到后面的 5
  • 第二个 5 没有更大值
  • 第三个 2 循环找到开头的 5

综合分析

  1. 时间复杂度 O(n):每个元素最多入栈和出栈两次
  2. 空间复杂度 O(n):栈和结果数组各占用线性空间
  3. 内存管理
    • 动态数组自动扩容
    • 严格释放所有分配的内存
  4. 健壮性
    • 处理任意长度输入(最大 100,000 字符)
    • 支持正负数输入
  5. 优势
    • 完全手动实现栈操作
    • 更精细的内存控制
    • 适合嵌入式等资源受限环境

GO

题目分析

给定一个环形数组,每个元素需要找到其后的第一个更大元素。若不存在则返回 -1。例如:

  • 输入 2,5,2 的输出为 5,-1,5,最后一个元素循环后找到更大的 5
  • 输入 1,2,3,4,5 的输出为 2,3,4,5,-1

解决思路

单调栈算法

  1. 遍历两次数组:通过取模操作模拟环形结构。
  2. 维护单调递减栈:栈中保存元素索引,确保栈顶元素对应的值最小。
  3. 更新结果数组:当当前元素大于栈顶元素时,栈顶元素的下一个更大元素即为当前元素。

Go 代码实现

package mainimport ("fmt""strings"
)func nextGreaterElements(nums []int) []int {n := len(nums)res := make([]int, n)for i := range res {res[i] = -1 // 初始化结果数组为-1}stack := []int{} // 单调栈,保存索引// 遍历两倍数组长度以模拟环形结构for i := 0; i < 2*n; i++ {current := nums[i%n] // 当前元素(环形取模)// 维护单调栈:当前元素比栈顶元素大时,更新结果for len(stack) > 0 && current > nums[stack[len(stack)-1]] {top := stack[len(stack)-1]stack = stack[:len(stack)-1] // 弹出栈顶res[top] = current          // 记录下一个更大元素}// 仅在第一次遍历时压入索引if i < n {stack = append(stack, i%n)}}return res
}func main() {// 示例测试input1 := "1,2,3,4,5"nums1 := parseInput(input1)result1 := nextGreaterElements(nums1)fmt.Println("示例1输出:", strings.Join(strings.Fields(fmt.Sprint(result1)), ",")) // 输出: 2,3,4,5,-1input2 := "2,5,2"nums2 := parseInput(input2)result2 := nextGreaterElements(nums2)fmt.Println("示例2输出:", strings.Join(strings.Fields(fmt.Sprint(result2)), ",")) // 输出: 5,-1,5
}// 将输入字符串转换为整数数组
func parseInput(input string) []int {strs := strings.Split(input, ",")nums := make([]int, len(strs))for i, s := range strs {fmt.Sscanf(s, "%d", &nums[i])}return nums
}

代码解析

  1. 初始化结果数组

    res := make([]int, n)
    for i := range res {res[i] = -1
    }
    
    • 创建长度与输入相同的数组,默认值为 -1
  2. 模拟环形遍历

    for i := 0; i < 2*n; i++ {current := nums[i%n]
    
    • 遍历 2n 次,i%n 将索引映射到原数组范围。
  3. 维护单调栈

    for len(stack) > 0 && current > nums[stack[len(stack)-1]] {top := stack[len(stack)-1]stack = stack[:len(stack)-1]res[top] = current
    }
    
    • 当当前元素大于栈顶元素时,弹出栈顶并更新结果。
  4. 压入索引

    if i < n {stack = append(stack, i%n)
    }
    
    • 只在第一次遍历时压入索引,避免重复处理。

示例测试

示例1:

输入1,2,3,4,5
输出2,3,4,5,-1
解析

  • 每个元素的后一个元素更大,最后一个元素无更大值。
示例2:

输入2,5,2
输出5,-1,5
解析

  • 第一个 2 的下一个更大元素是 5
  • 5 之后没有更大元素。
  • 最后一个 2 循环到开头找到 5

综合分析

  1. 时间复杂度 O(n):每个元素最多入栈和出栈两次,总操作次数为 4n,时间复杂度为线性。
  2. 空间复杂度 O(n):栈和结果数组的空间均为 O(n)
  3. 正确性保障
    • 环形处理:通过遍历两次数组,确保每个元素的后继被完整检查。
    • 单调栈特性:栈中保存未找到更大元素的索引,确保找到的是第一个更大值。
  4. 适用场景:高效处理大规模数据(n ≤ 10000)。

更多内容:

https://www.kdocs.cn/l/cvk0eoGYucWA

本文发表于【纪元A梦】,关注我,获取更多实用教程/资源!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/79180.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++零基础实践教程

模块一&#xff1a;准备工作与第一个程序 (热身) 在正式编写代码之前&#xff0c;我们需要了解为什么要学习 C&#xff0c;并搭建好我们的开发环境。然后&#xff0c;我们将编写并运行第一个简单的 C 程序。 1. 为什么选择 C&#xff1f; 你可能听说过很多编程语言&#xff…

6 CMD 与 PowerShell 指令大全、C 程序终端运行、字符编码切换指南

1 CMD 与 PowerShell 常用指令 在命令行环境中高效运行程序&#xff0c;掌握终端的基本操作命令至关重要。无论是 Windows 系统下的 CMD&#xff08;命令提示符&#xff09;还是 PowerShell&#xff0c;它们都配备了一系列实用的命令&#xff0c;助力我们管理文件、执行程序以及…

Linux——共享内存

目录 一、共享内存概念 二、共享内存的一些函数 2.1 shmget 创建共享内存 2.2 shmat 访问共享内存 2.3 shmdt 解除共享内存的映射 2.4 shnctl 删除共享内存段 三、共享内存 3.1 创建测试进程 3.2 使用循环测试 ​编辑 3.3 共享内存写入程序 3.4 带有信号量的共享内…

数启新疆,智领未来!2025新疆数字经济发展战略研讨会在乌市启幕

2025年4月20日&#xff0c;由新疆维吾尔自治区数字经济联合会主办、中钧科技有限公司承办的"2025新疆数字经济发展战略研讨会"将在乌鲁木齐水磨沟区金正大厦三层会议中心隆重召开。 作为本年度新疆数字经济领域规格最高的行业盛会&#xff0c;会议将汇聚自治区14个厅…

Nginx:轻量级高性能的Web服务器与反向代理服务器

目录 一.引言 二.Nginx的核心特点 2.1高性能与高并发 2.2低资源消耗 2.3功能丰富 2.4高度扩展性 三.Nginx的应用场景 3.1静态资源服务器 3.2反向代理服务器 3.3API网关 3.4Nginx的配置与使用 四.总结 一.引言 在互联网高速发展的今天&#xff0c;Web服务器的性能与…

嵌入式Linux设备使用Go语言快速构建Web服务,实现设备参数配置管理方案探究

本文探讨&#xff0c;利用Go语言及gin框架在嵌入式Linux设备上高效搭建Web服务器&#xff0c;以实现设备参数的网页配置。通过gin框架&#xff0c;我们可以在几分钟内创建一个功能完善的管理界面&#xff0c;方便对诸如集中器&#xff0c;集线器等没有界面的嵌入式设备的管理。…

KALI搭建log4j2靶场及漏洞复现全流程

这里使用了两台KALI虚拟机&#xff0c;一台用于安装靶场环境&#xff0c;一台用于攻击 一、Docker的安装&#xff08;靶机&#xff09; 1、Linux内核版本查看 #安装docker要求内核版本kerner>3.10 #为此&#xff0c;先检查当前Linux系统的内核版本 uname -a 2、Linux apt…

学习笔记—C++—模板初阶

目录 模板初阶 泛型编程 函数模板 模版概念 函数模版格式 模版的原理 函数模板的实例化 模版参数的匹配规则 类模板 模板初阶 泛型编程 使用函数重载虽然可以实现&#xff0c;但是有一下几个不好的地方&#xff1a; 1. 重载的函数仅仅是类型不同&#xff0c;代码复…

Docker 中多个容器之间的通信

在 Docker 中&#xff0c;多个容器之间的通信可以通过以下几种主要方式实现&#xff0c;具体选择取决于网络需求、隔离性及管理复杂度&#xff1a; 一、自定义 Bridge 网络&#xff08;推荐&#xff09; 通过创建自定义的 Docker 网络&#xff0c;容器可以加入同一网络并通过容…

Day1-初次接触UFS

经过导师初次介绍&#xff0c;了解工作以芯片测试为主&#xff0c;需坚持学习&#xff0c;小白大致需3-6月入门。整体学习应分为3大块&#xff0c;UFS协议占40%&#xff08;3-4h&#xff09;,C技能占40%&#xff08;3-4h&#xff09;,工具或业务占20%&#xff08;1-2h&#xff…

【LeetCode 热题100】二叉树构造题精讲:前序 + 中序建树 有序数组构造 BST(力扣105 / 108)(Go语言版)

&#x1f331; 二叉树构造题精讲&#xff1a;前序 中序建树 & 有序数组构造 BST 本文围绕二叉树的两类构造类题目展开解析&#xff1a; 从前序与中序遍历序列构造二叉树 将有序数组转换为二叉搜索树 我们将从「已知遍历构造树」和「平衡构造 BST」两个角度&#xff0c;拆…

JMeter重要的是什么

重要特性 支持多种协议&#xff1a; JMeter支持对多种协议进行性能测试&#xff0c;包括HTTP、HTTPS、FTP、JDBC&#xff08;数据库&#xff09;、LDAP、JMS、SOAP、REST等。这使得它能够适应各种不同的测试场景。强大的负载模拟能力&#xff1a; JMeter能够模拟大量的虚拟用户…

一文读懂WPF系列之MVVM

WPF MVVM 什么是MVVMWPF为何使用MVVM机制WPFMVVM 的实现手段 INotifyPropertyChanged​数据绑定的源端通知​​原理 PropertyChanged事件双向绑定的完整条件常见疑惑问题 什么是MVVM 翻译全称就是 model-view-viewmodel 3部分内容 以wpf的概念角度来解释就是 数据库数据源模型…

OCR API识别对比

OCR 识别DEMO OCR识别 demo 文档由来 最开始想使用百度开源的 paddlepaddle大模型 研究了几天&#xff0c;发现表格识别会跨行&#xff0c;手写识别的也不很准确。最终还是得使用现成提供的api。。 文档说明 三个体验下来 腾讯的识别度比较高&#xff0c;不论是手写还是识别表…

嵌入式MCU常用模块

日后填坑。 无线通信模块 2.4G 基本介绍 以NRF24L01为例。 NRF24L01是一款2.4GHz的无线收发模块&#xff0c;支持SPI通信协议&#xff0c;具有低功耗、高数据速率&#xff08;250kbps-2Mbps&#xff09;和多设备通信能力。 它可以同时与最多6个其他模块通信&#xff0c;适合…

记一次InternVL3- 2B 8B的部署测验日志

测试效果&#xff1a; 问题和耗时如图 5、资源占用 不释放资源会一直涨显存。总体还算满意&#xff0c;我试了好多个图理解大模型&#xff0c;就属它牛一点 附图一张 补充&#xff0c;测试InternVL3-2B的结果 1、模型下载魔搭社区 2、运行环境&#xff1a; 1、硬件 RTX 30…

Java版本对应关系表

Java版本对应关系表 以下Java主要版本&#xff08;Major Version&#xff09;与公开大版本号的对应关系 公开大版本名称Major 版本号内部版本号格式示例&#xff08;java -version输出&#xff09;Java 8 (1.8)52 (0x34)1.8.0_XXX1.8.0_301Java 953 (0x35)9.0.X9.0.4Java 105…

2025最新版flink2.0.0安装教程(保姆级)

Flink支持多种安装模式。 local&#xff08;本地&#xff09;——本地模式 standalone——独立模式&#xff0c;Flink自带集群&#xff0c;开发测试环境使用 standaloneHA—独立集群高可用模式&#xff0c;Flink自带集群&#xff0c;开发测试环境使用 yarn——计算资源统一…

android11 配置默认电池优化白名单

目录 1.介绍 2.读取配置文件 3.默认配置一个白名单列表 1.介绍 在 Android 11 中,DeviceIdleController 是负责控制设备进入 Doze 模式(闲置模式) 的核心系统服务,其内部方法 readConfigFileLocked() 负责从配置文件中读取 Doze 模式的行为参数,包括 idle 阶段的时间间…

java中的Future的设计模式 手写一个简易的Future

案例 例如&#xff1a;今天是小妹的生日&#xff0c;需要一个蛋糕有点仪式感&#xff0c;于是去蛋糕店预定&#xff0c;预定完之后&#xff0c;店老板说蛋糕做好了&#xff0c;到时电话通知你&#xff0c;不可能在这傻傻的等着吧&#xff0c;还有其他事情要做啊&#xff0c;于…