456-132-pattern¶
Try it on leetcode
Description¶
Given an array of n
integers nums
, a 132 pattern is a subsequence of three integers nums[i]
, nums[j]
and nums[k]
such that i < j < k
and nums[i] < nums[k] < nums[j]
.
Return true
if there is a 132 pattern in nums
, otherwise, return false
.
Example 1:
Input: nums = [1,2,3,4] Output: false Explanation: There is no 132 pattern in the sequence.
Example 2:
Input: nums = [3,1,4,2] Output: true Explanation: There is a 132 pattern in the sequence: [1, 4, 2].
Example 3:
Input: nums = [-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].
Constraints:
n == nums.length
1 <= n <= 2 * 105
-109 <= nums[i] <= 109
Solution(Python)¶
class Solution:
def find132pattern(self, nums: List[int]) -> bool:
return self.arrayasstack(nums)
# Time Compleity :O(n^3)
# space Complexity: O(1)
def bruteforce(self, nums):
n = len(nums)
for i in range(n):
for j in range(i + 1, n):
for k in range(j + 1, n):
if nums[i] < nums[k] < nums[j]:
return True
return False
# Time Compleity :O(n^2)
# space Complexity: O(1)
def betterbruteforce(self, nums):
n = len(nums)
min_i = inf
for j in range(n):
if nums[j] < min_i:
min_i = nums[j]
for k in range(j + 1, n):
if min_i < nums[k] < nums[j]:
return True
return False
# Time Compleity :O(n^2)
# space Complexity: O(n)
def interval(self, nums):
n = len(nums)
intervals = []
min_point_after_last_peak_index = 0
for i in range(1, n):
if nums[i] < nums[i - 1]:
if min_point_after_last_peak_index < i - 1:
intervals.append(
nums[min_point_after_last_peak_index], nums[i - 1])
min_point_after_last_peak_index = i
for i_num, j_num in intervals:
if i_num < nums[i] < j_num:
return True
return False
# Time Compleity :O(n)
# space Complexity: O(n)
def stack(self, nums):
n = len(nums)
if n < 3:
return False
stack = []
min_array = [-1] * n
min_array[0] = nums[0]
for i in range(1, n):
min_array[i] = min(min_array[i - 1], nums[i])
for j in range(n - 1, -1, -1):
if nums[j] <= min_array[j]:
continue
while stack and stack[-1] <= min_array[j]:
stack.pop()
if stack and min_array[j] < stack[-1] < nums[j]:
return True
stack.append(nums[j])
return False
# Time Compleity :O(nlogn)
# space Complexity: O(n)
def binarysearch(self, nums):
n = len(nums)
if n < 3:
return False
min_array = [-1] * n
min_array[0] = nums[0]
min_array[0] = nums[0]
for i in range(1, n):
min_array[i] = min(min_array[i - 1], nums[i])
k = n
for j in range(n - 1, -1, -1):
if nums[j] <= min_array[j]:
continue
k = bisect_left(nums, min_array[j] + 1, k, n)
if k < n and min_array[j] < nums[k] < nums[j]:
return True
k -= 1
nums[k] = nums[j]
return False
# Time Compleity :O(n)
# space Complexity: O(n)
def arrayasstack(self, nums):
if len(nums) < 3:
return False
min_array = [-1] * len(nums)
min_array[0] = nums[0]
for i in range(1, len(nums)):
min_array[i] = min(min_array[i - 1], nums[i])
k = len(nums)
for j in range(len(nums) - 1, -1, -1):
if nums[j] <= min_array[j]:
continue
while k < len(nums) and nums[k] <= min_array[j]:
k += 1
if k < len(nums) and nums[k] < nums[j]:
return True
k -= 1
nums[k] = nums[j]
return False