LeetCode 255. 驗證前序遍歷序列二叉搜索樹(單調棧)*

1. 題目

給定一個整數數組,你須要驗證它是不是一個二叉搜索樹正確的先序遍歷序列。數組

你能夠假定該序列中的數都是不相同的。網絡

參考如下這顆二叉搜索樹:

     5
    / \
   2   6
  / \
 1   3
示例 1:
輸入: [5,2,6,1,3]
輸出: false

示例 2:
輸入: [5,2,1,3,6]
輸出: true

進階挑戰:
您可否使用恆定的空間複雜度來完成此題?

來源:力扣(LeetCode)
連接:https://leetcode-cn.com/problems/verify-preorder-sequence-in-binary-search-tree
著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。

學習

2. 解題

2.1 遞歸超時解

  • 檢查左邊小於root,右邊是否都大於root,時間複雜度O(n2)
class Solution {
public:
    bool verifyPreorder(vector<int>& preorder) {
    	if(preorder.size() <= 2) return true;
    	return check(preorder, preorder[0], 1, preorder.size()-1);
    }

    bool check(vector<int>& arr, int root, int l, int r)
    {
    	if(l>=r) return true;
    	int split = l, i;
    	while(split <= r && arr[split] < root)
    		split++;//左邊部分比我root小
    	i = split;
    	for(i = split; i <= r; ++i)
    		if(arr[i] < root)//右邊部分因該都比我大,此處複雜度較高
    			return false;
    	return check(arr, arr[l], l+1, split-1) && (split > r ||check(arr, arr[split], split+1, r));
    }
};

2.2 單調棧

在這裏插入圖片描述

class Solution {
	map<int,int> m;
public:
    bool verifyPreorder(vector<int>& preorder) {
    	if(preorder.size() <= 2) return true;
    	int MIN = INT_MIN;
    	stack<int> s;
    	for(int i = 0; i < preorder.size(); ++i)
    	{
    		if(preorder[i] < MIN)
    			return false;
    		while(!s.empty() && s.top() < preorder[i])//遇到大的了,右分支
    		{
    			MIN = s.top();//記錄彈棧的棧頂爲最小值
    			s.pop();
    		}
    		s.push(preorder[i]);
    	}
    	return true;
    }
};

100 ms 21.5 MBurl


個人CSDN博客地址 https://michael.blog.csdn.net/spa

長按或掃碼關注個人公衆號(Michael阿明),一塊兒加油、一塊兒學習進步!
Michael阿明
.net

相關文章
相關標籤/搜索