161 模式(161模式教学)
161 模式是一种常用于编程中的算法思想,它的思路是在一个数列中找到一个满足以下条件的子序列:
该子序列的第一个数比其后面的数都小 该子序列的最后一个数比其前面的数都大 该子序列的中间数比其前后的数都小这个子序列就是 161 模式。
下面我们以一个例子来说明如何使用 161 模式。
假设有一个数列 {3, 1, 4, 2, 5},我们希望找到一个满足 161 模式的子序列。

首先,我们从左到右遍历数列,找到第一个满足第一个条件的数。在这个数列中,3 比其后面的数都小,所以 3 是符合条件的。
然后,我们再从右到左遍历数列,找到第一个满足第二个条件的数。在这个数列中,5 比其前面的数都大,所以 5 是符合条件的。
最后,我们在 3 和 5 之间寻找符合第三个条件的数。在这个数列中,4 比其前后的数都小,所以 4 是符合条件的。
于是,我们就找到了一个 161 模式的子序列:{3, 4, 5}。

使用 161 模式可以解决很多编程问题,比如在一个数列中查找是否存在一个三元组,它们分别是上面所述的三个条件。
现在,我们已经了解了 161 模式的基本思路和应用。下面我们来看一下它的代码实现。
// 寻找 161 模式的子序列
bool find_161_pattern(vector<int> nums) {
int n = nums.size();
vector<int> min_left(n), max_right(n);
min_left[0] = nums[0];
max_right[n - 1] = nums[n - 1];
// 计算 min_left 数组
for (int i = 1; i < n; i++) {
min_left[i] = min(min_left[i - 1], nums[i]);
}
// 计算 max_right 数组
for (int i = n - 2; i >= 0; i--) {
max_right[i] = max(max_right[i + 1], nums[i]);
}
// 查找符合条件的子序列
for (int i = 1; i < n - 1; i++) {
if (nums[i] > min_left[i - 1] && nums[i] < max_right[i + 1] &&
min_left[i - 1] < max_right[i + 1]) {
return true;
}
}
return false;
}
这段代码的思路是:首先分别计算每个位置左边的最小值和右边的最大值,然后遍历数列,寻找符合条件的子序列。
这就是使用 161 模式解决编程问题的基本思路,大家可以根据自己的需要来使用它。










