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; }