入棧操作的合法性 【重復元素】
阿新 • • 發佈:2018-03-03
操作 boolean i++ 當前 seq 必須 shm 排列 ...
問題描述:給定兩個序列,判斷是否為對應合法的入棧出棧序列?
* 若序列元素沒有重復
我想到大概三種方式,三者的前置操作均為先將元素與序列對應起來,java中放入map即可,map.put(元素 , 入棧序列) 後續判斷序列是否合理即可
假設給定入棧元素: 1,3,4,7,2,8
對應序列: 1,2,3,4,5,6
那麽出棧元素的組合可以是: 1,3,4,7,2,8; ,1,4,2,7,8,3; 4,3,2,8,7,1 ...
出棧元素對應的序列組合分別是:1,2,3,4,5,6; 1,3,5,4,6,2; 3,2,5,6,4,1 ...
通過分析入棧和出棧的操作,不難發現出棧的序列可以跳躍增大,卻必須依次有序減小(不一定連續)。因此問題轉化為判定序列減小必須有序即可,衍生出方法一二。
方法一:只看出棧和入棧的序列關系,那麽出棧是的序列必定是有規律的,具體的關系是:對於任意序列編號,其右邊比當前序列編號小的序列組合必定是降序。
1 //用通用方法處理,傳入入棧和出棧的序列,返回兩者是否滿足要求 2 boolean isValid(Object[] seqIn, Object[] seqOut) { 3 Map<Object, Integer> map = new HashMap<>(); 4 int seq = 1; 5 //記錄元素對應的序列 6 for (Object obj : seqIn) {7 map.put(obj, seq++); 8 } 9 //判斷每一個序列右邊比其小的都是降序排列 10 for (int i = 0; i < seqOut.length; i++) { 11 seq = map.get(seqOut[i]); 12 for (int j = i + 1; j < seqOut.length; j++) { 13 if (map.get(seqOut[j]) < map.get(seqOut[i])) {14 if (map.get(seqOut[j]) < seq) { 15 seq = map.get(seqOut[j]); 16 } else { 17 return false; 18 } 19 } 20 } 21 } 22 return true; 23 }
入棧操作的合法性 【重復元素】