[leetcode]-456. 132 Pattern(C语言)

Given a sequence of n integers a1, a2, ..., an, a 132 pattern is a subsequence ai, aj, ak suchthat i < j < k and ai < ak < aj. Design an algorithm that takes a list of n numbers as input and checks whether there is a 132 pattern in the list.

Note: n will be less than 15,000.

Example 1:

Input: [1, 2, 3, 4]

Output: False

Explanation: There is no 132 pattern in the sequence.

Example 2:

Input: [3, 1, 4, 2]

Output: True

Explanation: There is a 132 pattern in the sequence: [1, 4, 2].

Example 3:

Input: [-1, 3, 2, 0]

Output: True

Explanation: There are three 132 patterns in the sequence: [-1, 3, 2], [-1, 3, 0] and [-1, 2, 0].

方法一:暴力破解

bool find132pattern(int* nums, int numsSize) {
    if(numsSize<=2)
        return false;
    int i,j,k;
    for(i=0;i<numsSize-2;i++)
        for(j=i+1;j<numsSize-1;j++)
            for(k=j+1;k<numsSize;k++)
            {
                if(nums[i]<nums[j]&&nums[i]<nums[k]&&nums[k]<nums[j])
                    return true;
            }
    return false;
}

运行时间太长导致无法通过。

方法二:通过固定j,在j之前的元素中找到最小的元素作为i,然后在nums[i]和nums[j]的范围内判段k。(通过)

bool find132pattern(int* nums, int numsSize) {
    if(numsSize<=2)
        return false;
    int i=0,j,k;
    for(j=1;j<numsSize-1;j++)
    {
        if(nums[j]<nums[i])
        {
            i=j;
            continue;
        }
        for(k=j+1;k<numsSize;k++)
        {
            if(nums[k]>nums[i]&&nums[k]<nums[j])
                return true;
        }
    }
    return false;
}

猜你喜欢

转载自blog.csdn.net/shen_zhu/article/details/79603314