1. 程式人生 > >資料結構Stack例項(三):求元素的下一個更大的值

資料結構Stack例項(三):求元素的下一個更大的值

    題目:給定一個數組,打印出每一個元素的下一個更大的元素( Next Greater Element,NGE )。一個元素x的下一個更大的元素是指在x的右邊第一個比該元素大的元素。如果沒有更大的元素,則輸出-1。

方法1 列舉

    使用二重迴圈,分別遍歷所有的元素,即可找到該元素的NGE。時間複雜度O(n^2).


方法2 使用棧

    可以用棧來維護一個遞減的序列,裡面儲存的陣列左邊未找到NGE的元素,初始時只包含第一個元素。我們可以假定棧頂就是最小的元素,因此可以用從棧頂top開始和後面的元素next比較。如果top<next則說明,找到了top的NGE,可以彈出棧。然後繼續比較棧頂元素top和next,直到棧為空或 next <= top。然後把next加入棧,以便查詢next的NGE。由於只有一次遍歷,時間複雜度為O(n)*

方法2 的實現程式碼如下:

/**   
* @Title: NextGreaterElement.java 
* @Package stack 
* @Description: TODO 
* @author peidong  
* @date 2017-5-4 上午9:20:17 
* @version V1.0   
*/
package stack;


import java.util.Stack;



public class NextGreaterElement {



public static void findNGE(int[] arr, int len){
//初始化棧
Stack<Integer> stack = new Stack<Integer>();
//將陣列首個元素入棧
stack.push(arr[0]);
int top, next;   //定義兩個指標變數
for(int i = 1; i < len ; i++){
next = arr[i];
top = stack.peek();

//判斷是否找到棧頂元素的NGE,此處是迴圈判斷棧中元素與當前元素next值得比較,輸出不會按照原陣列順序
while((!stack.isEmpty()) && top < next){
System.out.printf("%d --> %d", top, next);
System.out.println();
stack.pop();  //出棧

//繼續判斷棧頂
if(!stack.isEmpty()){
top = stack.peek();
}
}
//將下一個元素入棧
stack.push(next);
}
while(!stack.isEmpty()){
top = stack.peek();
stack.pop();
System.out.printf("%d --> %d", top, -1);
System.out.println();
}
}
/** 
* @Title: main 
* @Description: TODO
* @param @param args    
* @return void    
* @throws 
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr[]= {11, 13, 10, 5, 12,21, 3};
        int len = arr.length;
        findNGE(arr, len);


}


}