Share the joy
This one is from g4g. link
Given an array, print the Next Greater Element (NGE) for every element. The Next greater Element for an element x is the first greater element on the right side of x in array. Elements for which no greater element exist, consider next greater element as -1.
This is actually a pratice for stack.
- package feb;
- import java.util.Stack;
- public class NextGreaterElement {
- public static void main(String[] args) {
- int[] arr = { 11, 13, 3, 21, 7, 6, 4, 9, 12, 15 };
- Element[] arrEle = getNGE(arr);
- for (int i = 0; i < arrEle.length; i++) {
- System.out.println(arrEle[i]);
- }
- }
- /*
- * http://www.geeksforgeeks.org/next-greater-element/ Using stack pratice.
- * Given an array, print the Next Greater Element (NGE) for every element.
- * The Next greater Element for an element x is the first greater element on
- * the right side of x in array. Elements for which no greater element
- * exist, consider next greater element as -1. Examples: a) For any array,
- * rightmost element always has next greater element as -1. b) For an array
- * which is sorted in decreasing order, all elements have next greater
- * element as -1. c) For the input array [4, 5, 2, 25}, the next greater
- * elements for each element are as follows.
- *
- * Element NGE
- * 4 –> 5
- * 5 –> 25
- * 2 –> 25
- * 25 –> -1
- *
- * d) For the input array
- * [13, 7, 6, 12}, the next greater elements for each element are as
- * follows. *
- * Element NGE
- * 13 –> -1
- * 7 –> 12
- * 6 –> 12
- * 12 –> -1
- */
- public static Element[] getNGE(int[] arr) {
- if (arr == null) {
- return null;
- }
- Element[] arrEle = new Element[arr.length];
- for (int i = 0; i < arr.length; i++) {
- arrEle[i] = new Element(arr[i], i);
- }
- Stack<Element> s = new Stack<Element>();
- s.push(arrEle[0]);
- for (int i = 1; i < arrEle.length; i++) {
- while (!s.empty() && arrEle[i].value > s.peek().value) {
- Element ele = s.pop();
- arrEle[ele.pos].nge = arrEle[i].value;
- }
- s.push(arrEle[i]);
- }
- // rest elements in stack has no next larger element.
- while (!s.empty()) {
- Element ele = s.pop();
- arrEle[ele.pos].nge = -1;
- }
- return arrEle;
- }
- static class Element {
- int value;
- int nge;
- int pos;
- Element(int value, int pos) {
- this.value = value;
- this.pos = pos;
- }
- @Override
- public String toString() {
- return value + “\t” + nge;
- }
- }
- }