方法1: recursion。时间复杂nlogn,空间复杂n
class Solution {
public boolean verifyPreorder(int[] preorder) {
if(preorder.length == 0 || preorder.length == 1 || preorder.length == 2) return true;
int flag1 = 0;
for(int i = 1; i < preorder.length; i++){
if(preorder[i] > preorder[0]){
flag1 = i;
break;
}
}
if(flag1 == 0) return verifyPreorder(Arrays.copyOfRange(preorder,1,preorder.length));
int[] left = Arrays.copyOfRange(preorder, 1, flag1);
int[] right = Arrays.copyOfRange(preorder, flag1, preorder.length);
boolean b1 = isSmaller(left, preorder[0]);
boolean b2 = isBigger(right, preorder[0]);
boolean b3 = verifyPreorder(left);
boolean b4 = verifyPreorder(right);
return b1 && b2 && b3 && b4;
}
public boolean isSmaller(int[] arr, int idx){
for(int digit : arr){
if(digit > idx) return false;
}
return true;
}
public boolean isBigger(int[] arr, int idx){
for(int digit : arr){
if(digit < idx) return false;
}
return true;
}
}
方法2: simulate preorder traversal。用一个stack,模拟preorder来压栈。时间复杂n,空间复杂n。
class Solution {
public boolean verifyPreorder(int[] preorder) {
if(preorder.length == 0) return true;
Stack<Integer> stack = new Stack<>();
int low = Integer.MIN_VALUE;
for(int i = 0; i < preorder.length; i++){
if(preorder[i] < low) return false;
if(stack.isEmpty()) {
stack.push(preorder[i]);
continue;
}
if(preorder[i] < stack.peek()){
stack.push(preorder[i]);
}else{
low = stack.pop();
i--;
}
}
return true;
}
}
方法3: 这是一个空间复杂为1的算法。具体我没看,想了解的话可以看lc discusion 热评第一看一下。
总结:
- 无