寻找下一个较大元素 --- 利用栈
来源:互联网 发布:剑网3捏脸数据详细 编辑:程序博客网 时间:2024/05/21 09:20
这是一道亚马逊的面试题。给定一个数组,打印出每一个元素的下一个更大的元素( Next Greater Element,NGE ),就叫做NGE问题吧。
a) 任何数组,最右边的元素的NGE为-1。
b) 对于一个降序排序的数组,所有元素得到NGE为-1
c) 对于数组{4, 5, 2, 25}, NGE分别为 5,25,25,-1
d) 对于数组{13, 7, 6, 12}, NGE分别为 -1,12,12,-1
方法1----枚举
使用二重循环,分别遍历所有的元素,即可找到该元素的NGE。是否复杂度O(n^2).
方法2----使用栈
数据测试:
一个元素x的下一个更大的元素是指在x的右边第一个比该元素大的元素。如果没有更大的元素,则输出-1。
a) 任何数组,最右边的元素的NGE为-1。
b) 对于一个降序排序的数组,所有元素得到NGE为-1
c) 对于数组{4, 5, 2, 25}, NGE分别为 5,25,25,-1
d) 对于数组{13, 7, 6, 12}, NGE分别为 -1,12,12,-1
方法1----枚举
使用二重循环,分别遍历所有的元素,即可找到该元素的NGE。是否复杂度O(n^2).
方法2----使用栈
我们可以用栈来维护一个递减的序列,里面存储的数组左边未找到NGE的元素,初始时只包含第一个元素。我们可以假定栈顶就是最小的元素,因此可以用从栈顶top开始和后面的元素next比较。如果top<next则说明,找到了top的NGE,可以弹出栈。然后继续比较栈顶元素top和next,直到栈为空或 next <= top。然后把next加入栈,以便查找next的NGE。由于只有一次遍历,时间复杂度为O(n)。
代码如下:
#include <iostream>#include <stack>using namespace std;void FindNGE(int arry[], int & len){stack<int> s;s.push(arry[0]);int next, top;for (int i = 1; i < len; i++){top = s.top();next = arry[i];while (!s.empty() && top < next){cout << top << "-->" << next << endl;s.pop();//继续判断栈顶if (!s.empty())top = s.top();}//将下一个元素入栈s.push(next);}while (!s.empty()){cout << s.top() << "-->" << "-1" << endl;s.pop();}}int main(){int arry[] = { 11, 13, 10, 5, 12,21, 3 };int n = sizeof(arry) / sizeof(int);FindNGE(arry, n);return 0;}
数据测试:
题目来自: http://www.acmerblog.com/next-greater-element-5811.html
1 0
- 寻找下一个较大元素 --- 利用栈
- 栈 之 寻找下一个较大元素 next greater element
- 下一个较大元素
- 下一个较大元素II
- 下一个较大元素
- 下一个较大元素
- 下一个较大元素
- 下一个较大元素
- [程序员面试金典]1002.下一个较大元素
- 程序员面试金典——下一个较大元素
- 下一个较大排列组合
- 下一个较大值
- 496. Next Greater Element I(寻找下一个较大的数)
- 下一个较大值 栈和队列(优化防止TLE)
- 金典——下一个较大的元素2(需优化)
- 《Cracking the Coding Interview程序员面试金典》----下一个较大元素(所有比他大中最小的)
- 寻找下一个最大排列
- 牛客网 | 寻找下一个结点
- Java线程第二弹--资源冲突问题
- Android 快速开发系列 打造万能的ListView GridView 适配器
- public, protect, private定义变量的区别
- java反射获取某接口的所有实现类
- xcode插件入门教程
- 寻找下一个较大元素 --- 利用栈
- 基础之菜单项的使用
- 第一周项目
- C提高——数组、数组数据类型、数组数据类型指针、多维数组本质等
- tomcat启动后访问应用超时问题
- zhu的工作日记:LayoutAnimation的简单使用(android)
- Java 编程思想第四版 笔记
- C语言的精髓-指针
- OpenJudge百炼习题解答(C++)--题2690:首字母大写