今日的LeetCode它蹦蹦跳跳地来了。依旧是随机pick的一道题目,难度是中等。
首先可以很明确一件事,要想找到一个132模式的子序列,原序列必须包含三个及以上个元素。而且题目中没有让我们把所有的132模式子序列输出,只需要确定有没有就可以了,所以可以利用一些特殊的情况之类的方法来解决。
不过呢,我就不一样了,特殊情况咱也举不出来,所以只好老老实实地按常规步骤走咯。
主要想法是从后往前遍历,寻找符合条件的次大值,然后和次大值进行比较,如果当前元素小于次大值,那么返回true。
如何寻找次大值呢?很简单,如果当前元素大于栈顶元素,那么栈顶元素就是符合条件的次大值,因为栈顶元素和当前元素在原序列中的位置关系是当前元素在前,栈顶元素在后,符合132模式中的32。
所以整个流程应该是这样的:
- 申明变量,last表示132模式中的最后一个元素,也就是2,次大值;sta就是上面说的栈了。
- 从后往前遍历原序列。
- 如果当前元素小于last,即出现132模式中的1,则返回true。
- 如果当前元素大于或等于last,则更新last。
- 将当前元素压入栈中。
思索了一遍,应该没有要补充的了,所以直接上代码。这次代码分了java和python。
java代码:
class Solution {
public boolean find132pattern(int[] nums) {
int n = nums.length;
int last = Integer.MIN_VALUE; // 132中的2
Stack<Integer> sta = new Stack<>();// 用来存储132中的3
if(nums.length < 3)
return false;
for(int i=n-1; i>=0; i--){
if(nums[i] < last) // 若出现132中的1则返回正确值
return true;
// 若当前值大于或等于2则更新2(2为栈中小于当前值的最大元素)
while(!sta.isEmpty() && sta.peek() < nums[i]){
last = sta.pop();
}
// 将当前值压入栈中
sta.push(nums[i]);
}
return false;
}
}
相关注释也写在上面了,应该是很清晰的。下面是python代码:
class Solution:
def find132pattern(self, nums: List[int]) -> bool:
size = len(nums)
last = -sys.maxsize
sta = []
if size < 3:
return False
for i in range(size-1,-1,-1):
if nums[i] < last:
return True
while sta and sta[-1] < nums[i]:
last = sta.pop()
sta.append(nums[i])
return False
其实都是一样的。