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

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

作者: 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 相同,只不过栈中元素从底到上按照从小到大的顺序

相关文章

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

    计算数组中每个数左边第一个比其大的值 如果用最简单的暴力法,时间复杂度最坏情况下 O(n^2) 用栈解决,遍历到a...

  • 排序算法-快速排序

    快速排序算法的核心是在一个数组中,将第一个元素放置在中间位置使这个数组变为左边比这个元素都小,右边比这个组都大的一...

  • 5. 第k大元素(lintcode)

    利用快排的思想。 根据基准值(一般为数组的第一个数)。进行左右划分,比基准小的放到基准值右边,反之放左边(因为是第...

  • Quick Sort 快速排序

    题目 快速排序,就是选定一个目标数flag,然后将这个数组中,比这个数小的放左边,比这个数大的放右边。这样形成两个...

  • 【二分查找】Find Minimum in Rotated So

    思路:左边比右边大,当左边比右边小时,就是最小值

  • 小和问题

    小和问题 在一个数组中,每一个元素左边比当前元素值小的元素值累加起来,叫做这个数组的小和例如:[2,3,4,1,5...

  • 2018-05-30 496. Next Greater Ele

    题意:给你两个数组,找出数组一中所有的元素,在第二个数组中对应位置右边第一个比该数大的数。 第一个数组中元素“4”...

  • 快速排序

    一次快速排序是对一个数组,以第一个数为基准,将比该数大的数移动到右边,比该数小的移动到左边而形成的。然后将该基数的...

  • 排序算法 --- 快速排序

    一、排序思想 将数组中的一个数作为基准,比该数小的放到左边,比该数大的放到右边; 对左右两边再进行上述操作,即把左...

  • C语言数组二分查找

    需要一个左边界(low)以及右边界(high),还有中间值(mid),若右边界比左边界小(左比右大)时,退出循环,...

网友评论

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

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