🧠
Better Approach (Using Min Prefix Array and Nested Loop)
💡 This approach improves efficiency by precomputing the minimum value before each index, reducing one nested loop and avoiding redundant comparisons.
Intuition
For each middle element j, track the minimum element to its left (i) and check if there exists a k > j with nums[k] between min prefix and nums[j].
Algorithm
- Create an array min_prefix where min_prefix[j] = minimum of nums[0..j-1]
- For each j from 1 to n-2, iterate k from j+1 to n-1
- Check if min_prefix[j] < nums[k] < nums[j], return true if yes
- Return false if no pattern found
💡 Precomputing min_prefix helps quickly find the smallest i for each j, reducing redundant checks.
def find132pattern(nums):
n = len(nums)
if n < 3:
return False
min_prefix = [0] * n
min_prefix[0] = nums[0]
for i in range(1, n):
min_prefix[i] = min(min_prefix[i-1], nums[i])
for j in range(1, n - 1):
if nums[j] <= min_prefix[j]:
continue
for k in range(j + 1, n):
if min_prefix[j] < nums[k] < nums[j]:
return True
return False
# Driver code
if __name__ == '__main__':
print(find132pattern([3,1,4,2])) # True
print(find132pattern([1,2,3,4])) # False
Line Notes
min_prefix = [0] * nInitialize array to store minimum prefix values
min_prefix[0] = nums[0]First element is the minimum prefix for index 0
for i in range(1, n):Fill min_prefix with running minimums
if min_prefix[j] < nums[k] < nums[j]:Check if nums[k] fits the 132 pattern between min_prefix[j] and nums[j]
public class Solution {
public static boolean find132pattern(int[] nums) {
int n = nums.length;
if (n < 3) return false;
int[] minPrefix = new int[n];
minPrefix[0] = nums[0];
for (int i = 1; i < n; i++) {
minPrefix[i] = Math.min(minPrefix[i - 1], nums[i]);
}
for (int j = 1; j < n - 1; j++) {
if (nums[j] <= minPrefix[j]) continue;
for (int k = j + 1; k < n; k++) {
if (minPrefix[j] < nums[k] && nums[k] < nums[j]) {
return true;
}
}
}
return false;
}
public static void main(String[] args) {
System.out.println(find132pattern(new int[]{3,1,4,2})); // true
System.out.println(find132pattern(new int[]{1,2,3,4})); // false
}
}
Line Notes
int[] minPrefix = new int[n];Array to store minimum prefix values
minPrefix[0] = nums[0];Initialize first prefix minimum
for (int i = 1; i < n; i++) {Compute running minimum prefix
if (minPrefix[j] < nums[k] && nums[k] < nums[j]) {Check if nums[k] fits the 132 pattern
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool find132pattern(vector<int>& nums) {
int n = nums.size();
if (n < 3) return false;
vector<int> minPrefix(n);
minPrefix[0] = nums[0];
for (int i = 1; i < n; i++) {
minPrefix[i] = min(minPrefix[i - 1], nums[i]);
}
for (int j = 1; j < n - 1; j++) {
if (nums[j] <= minPrefix[j]) continue;
for (int k = j + 1; k < n; k++) {
if (minPrefix[j] < nums[k] && nums[k] < nums[j]) {
return true;
}
}
}
return false;
}
int main() {
vector<int> nums1 = {3,1,4,2};
vector<int> nums2 = {1,2,3,4};
cout << boolalpha << find132pattern(nums1) << endl; // true
cout << boolalpha << find132pattern(nums2) << endl; // false
return 0;
}
Line Notes
vector<int> minPrefix(n);Stores minimum prefix values
minPrefix[0] = nums[0];Initialize first prefix minimum
for (int i = 1; i < n; i++) {Compute running minimum prefix
if (minPrefix[j] < nums[k] && nums[k] < nums[j]) {Check if nums[k] fits the 132 pattern
function find132pattern(nums) {
const n = nums.length;
if (n < 3) return false;
const minPrefix = new Array(n);
minPrefix[0] = nums[0];
for (let i = 1; i < n; i++) {
minPrefix[i] = Math.min(minPrefix[i - 1], nums[i]);
}
for (let j = 1; j < n - 1; j++) {
if (nums[j] <= minPrefix[j]) continue;
for (let k = j + 1; k < n; k++) {
if (minPrefix[j] < nums[k] && nums[k] < nums[j]) {
return true;
}
}
}
return false;
}
// Test cases
console.log(find132pattern([3,1,4,2])); // true
console.log(find132pattern([1,2,3,4])); // false
Line Notes
const minPrefix = new Array(n);Array to store minimum prefix values
minPrefix[0] = nums[0];Initialize first prefix minimum
for (let i = 1; i < n; i++) {Compute running minimum prefix
if (minPrefix[j] < nums[k] && nums[k] < nums[j]) {Check if nums[k] fits the 132 pattern
Precomputing min prefix is O(n), nested loops are O(n^2), overall quadratic time.
💡 For n=1000, this means about 1,000,000 operations, which is borderline but better than cubic.
Interview Verdict: Accepted but inefficient for large inputs
This approach is a clear improvement but still too slow for the largest constraints, motivating further optimization.