C++程序:查找列表nums中满足nums[i] < nums[k] < nums[j]的三元组
假设我们有一个名为nums的数字列表,我们需要检查是否存在三元组(i, j, k)使得i < j < k并且nums[i] < nums[k] < nums[j]。
因此,如果输入类似于nums = [2, 12, 1, 4, 4],则输出将为True,因为[2, 12, 4]满足条件,因为2 < 4 < 12。
为了解决这个问题,我们将遵循以下步骤:
n := nums的大小
定义一个大小为n的数组left
left[0] := nums[0]
for i := 1 to n-1 do −
left[i] := min(nums[i], left[i - 1])
定义一个栈st
for i := n - 1 downto 1 do −
x := left[i - 1]
while st不为空且st的栈顶 <= x do −
从st中弹出元素
if st不为空且x < nums[i]且nums[i] > st的栈顶,则 −
返回true
将nums[i]压入st
返回false
示例
让我们看看下面的实现,以便更好地理解:
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool solve(vector<int>& nums) {
int n = nums.size();
vector<int> left(n);
left[0] = nums[0];
for (int i = 1; i < n; i++) {
left[i] = min(nums[i], left[i - 1]);
}
stack<int> st;
for (int i = n - 1; i >= 1; i--) {
int x = left[i - 1];
while (!st.empty() && st.top() <= x)
st.pop();
if (!st.empty() && x < nums[i] && nums[i] > st.top())
return true;
st.push(nums[i]);
}
return false;
}
};
bool solve(vector<int>& nums) {
return (new Solution())->solve(nums);
}
int main(){
vector<int> v = {2, 12, 1, 4, 4};
cout << solve(v);
}输入
{2, 12, 1, 4, 4}输出
1
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP