資料結構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);
}
}