1. 程式人生 > >Leetcode水題——132模式

Leetcode水題——132模式

題目

題解

首先想到的是回溯法,但最壞演算法複雜度為O(n^3),而且題目只需要判斷是否存在,而回溯法會把所有可能都嘗試一遍,接著想到貪心,首先找到一個區域中的最小值A(下標記為i),接著從i+1開始找到一個區域內的最大值B(下標記為j),從j+1開始找,尋找位於A與B之間的數,找到了,返回true,否則返回從j+1開始找下一個區域最小,這麼做是為了保持最大的容錯性,如下:

上圖中A是區域最小,B是區域最大,設位於A之前且比A大的數為A1,則後面比A1大的數一定大於A,但是比A大的數不一定大於A1,設AB之間且比B小但比A大的數為B1,則B後面比B1要小的數一定小於B,比B要小的數卻不一定比B1要小,在這個區域中,選擇A為第一個數,B為第二數字,可以儘可能大的獲得132模式

程式碼

class Solution {
public:
    bool find132pattern(vector<int>& nums) {
        int size=nums.size();
        int i=0,j,k;
        while(i<size){
            while(i<size-1&&nums[i]>nums[i+1]) i++;
            j=i+1;
            while(j<size-1&&nums[j]<nums[j+1]) j++;
            k=j+1;
            while(k<size){
                if(nums[k]<nums[j]&&nums[k]>nums[i]) return true;
                else k++;
            }
            i=j+1;
            
        }
        return false;
    }
};