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

更新于:2020年12月22日

251 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.