美文网首页
计算数组中每个数左边/右边第一个比其大/小的值

计算数组中每个数左边/右边第一个比其大/小的值

作者: Ethan_Walker | 来源:发表于2018-12-19 15:12 被阅读11次

    计算数组中每个数左边第一个比其大的值

    如果用最简单的暴力法,时间复杂度最坏情况下 O(n^2)

    用栈解决,遍历到a[i]

    • 当栈中为空,直接压入
    • 栈不为空,比较栈顶元素 top 和 a[i]。 若 top < a[i] ,弹出栈顶元素。循环执行,直到遇到第一个 top>a[i] (top即为第一个比其大的元素)或者 栈为空(左边没有比 a[i] 大的元素)

    因此栈中元素从底到上按照从大到小的顺序

            for (int index = 0; index < length; index++) {
                while (!stack.isEmpty() && arr[index] >= stack.peek()) {
                    stack.pop();
                }
                if (!stack.isEmpty()) {
                    leftFirstMax[index] = stack.peek();
                }
                stack.push(arr[index]);
            }
    
    

    计算数组中每个数右边第一个比其大的值

    思路完全一样,只不过遍历的顺序从右到左

            // 栈中从栈底到栈顶 顺序,从右往左遍历,计算每个数右边第一个比其大的值
            for (int index = length - 1; index >= 0; index--) {
                while (!stack.isEmpty() && arr[index] >= stack.peek()) {
                    stack.pop();
                }
                if(!stack.isEmpty()){
                    rightFirstMax[index]= stack.peek();
                }
    
            }
    

    计算数组中每个数左边第一个比其小的值

    思路与 1 相同,只不过栈中元素从底到上按照从小到大的顺序

    相关文章

      网友评论

          本文标题:计算数组中每个数左边/右边第一个比其大/小的值

          本文链接:https://www.haomeiwen.com/subject/zfqdkqtx.html