456. 132模式
解法:单调栈
求解该问题,可以通过逆序遍历数组,判断当前元素是否小于右区间的次大值。这是我们需要一个数据结构来求出右区间的最大值和次大值,对此我们可以考虑使用单调栈。栈中元素为元素3候选值,另定义一个变量来存储次大值。若当前元素大于栈顶元素,则出栈,并更新次大值,使其始终为右区间小于栈顶元素的最大值;若当前元素小于次大值,则return True。
class Solution:
def find132pattern(self, nums: List[int]) -> bool:
n = len(nums)
candidate_k = [nums[n - 1]]
max_k = float("-inf")
for i in range(n - 2, -1, -1):
if nums[i] < max_k:
return True
while candidate_k and nums[i] > candidate_k[-1]:
max_k = candidate_k[-1]
candidate_k.pop()
if nums[i] > max_k:
candidate_k.append(nums[i])
return False
976. 三角形的最大周长
解法:排序+贪心
找到能构造三角形的最大周长,实质上就是找到能够满足 a+b>c的最大周长,其中 c > a and c > b。因此我们可以考虑排序,倒序枚举第 i 个数作为最长边,那么我们只要看其前两个数 能否与其能够构造三角形,若能,则返回它们的和作为最大周长。
class Solution:
def largestPerimeter(self, nums: List[int]) -> int:
nums.sort()
for i in range(len(nums)-1, 1, -1):
if nums[i-1] + nums[i-2] > nums[i]:
return nums[i-1] + nums[i-2] + nums[i]
return 0