You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何找出数组中每个元素左侧的全局最大值(非左侧首个更大元素)

问题解决:获取数组每个元素左侧的全局最大值

原代码分析

你的现有代码使用单调栈实现了左侧首个更大元素的查找逻辑,但要获取左侧全局最大值(即当前元素左边所有元素中的最大值),逻辑需要调整——全局最大值不需要关注“首个”,只需要维护遍历过程中遇到的最大值即可。

修改后的实现

方法1:直接维护全局最大值(最优解,时间复杂度O(n))

不需要栈结构,仅在遍历过程中记录当前最大值,每一步直接用该值作为当前元素的左侧全局最大值:

public static void main(String[] args) {
    int a[] = {3, 0, 0, 2, 0, 4};
    ArrayList<Integer> al = new ArrayList<>();
    // 第一个元素左侧无元素,用-1表示,可根据需求调整
    int leftGlobalMax = -1;
    for (int i = 0; i < a.length; i++) {
        al.add(leftGlobalMax);
        // 更新全局最大值:当前元素更大则替换
        if (a[i] > leftGlobalMax) {
            leftGlobalMax = a[i];
        }
    }
    System.out.println(al);
}

输出结果:[-1, 3, 3, 3, 3, 3],对应每个元素左侧的全局最大值。

方法2:基于原单调栈逻辑修改

如果坚持用栈实现,可调整栈的维护逻辑,让栈中始终保存当前全局最大值的索引:

public static void main(String[] args) {
    int a[] = {3, 0, 0, 2, 0, 4};
    Stack<Integer> st = new Stack<>();
    ArrayList<Integer> al = new ArrayList<>();
    for (int i = 0; i < a.length; i++) {
        if (st.empty()) {
            al.add(-1);
        } else {
            al.add(a[st.peek()]);
        }
        // 当前元素更大时,清空栈并更新为当前元素的索引
        if (st.empty() || a[i] > a[st.peek()]) {
            st.clear();
            st.push(i);
        }
    }
    System.out.println(al);
}

输出结果与方法1一致,但该方法效率低于直接维护最大值的方案。

关键区别说明

  • 左侧首个更大元素:寻找左边第一个比当前元素大的元素,可能并非全局最大。
  • 左侧全局最大值:寻找左边所有元素中的数值最大值,与位置无关。

内容的提问来源于stack exchange,提问作者Varun Savai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 04:55:28