📌  相关文章
📜  检查是否存在三元组 (i, j, k) 使得 arr[i] < arr[k] < arr[j] for i < j < k

📅  最后修改于: 2021-09-06 05:56:19             🧑  作者: Mango

给定一个数组arr[] ,任务是检查是否存在三元组(i, j, k)使得arr[i]然后打印Yes否则打印No

例子:

朴素的方法:这个想法是生成所有可能的三元组,如果有任何三元组满足给定的条件,则打印Yes else 打印No
时间复杂度: O(N 3 )
辅助空间: O(1)

高效的方法:优化上述方法的想法是使用堆栈来跟踪数组arr[]中每个元素右侧的较小元素。以下是步骤:

  • 从末尾遍历数组并维护一个以降序存储元素的堆栈。
  • 要按降序维护堆栈,请弹出小于当前元素的元素。然后将弹出的元素标记为三元组的第三个元素。
  • 如果任何元素小于最后弹出的元素(标记为三元组的第三个元素),则反向遍历数组。然后它们存在一个满足给定条件的三元组并打印Yes
  • 否则打印No

下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
using namespace std;
  
// Function to check if there exist
// triplet in the array such that
// i < j < k and arr[i] < arr[k] < arr[j]
bool findTriplet(vector& arr)
{
    int n = arr.size();
    stack st;
  
    // Initialize the heights of h1 and h2
    // to INT_MAX and INT_MIN respectively
    int h3 = INT_MIN, h1 = INT_MAX;
    for (int i = n - 1; i >= 0; i--) {
  
        // Store the current element as h1
        h1 = arr[i];
  
        // If the element at top of stack
        // is less than the current element
        // then pop the stack top
        // and keep updating the value of h3
        while (!st.empty()
            && st.top() < arr[i]) {
  
            h3 = st.top();
            st.pop();
        }
  
        // Push the current element
        // on the stack
        st.push(arr[i]);
  
        // If current element is less
        // than h3, then we found such
        // triplet and return true
        if (h1 < h3) {
            return true;
        }
    }
  
    // No triplet found, hence return false
    return false;
}
  
// Driver Code
int main()
{
    // Given array
    vector arr = { 4, 7, 5, 6 };
  
    // Function Call
    if (findTriplet(arr)) {
        cout << " Yes" << '\n';
    }
    else {
        cout << " No" << '\n';
    }
    return 0;
}


Java
// Java program for the above approach 
import java.util.*; 
  
class GFG{
      
// Function to check if there exist 
// triplet in the array such that 
// i < j < k and arr[i] < arr[k] < arr[j] 
public static boolean findTriplet(int[] arr) 
{ 
    int n = arr.length;
    Stack st = new Stack<>();
  
    // Initialize the heights of h1 and h2 
    // to INT_MAX and INT_MIN respectively 
    int h3 = Integer.MIN_VALUE;
    int h1 = Integer.MAX_VALUE; 
  
    for(int i = n - 1; i >= 0; i--) 
    { 
          
        // Store the current element as h1 
        h1 = arr[i]; 
  
        // If the element at top of stack 
        // is less than the current element 
        // then pop the stack top 
        // and keep updating the value of h3 
        while (!st.empty() && st.peek() < arr[i])
        { 
            h3 = st.peek(); 
            st.pop(); 
        } 
  
        // Push the current element 
        // on the stack 
        st.push(arr[i]); 
  
        // If current element is less 
        // than h3, then we found such 
        // triplet and return true 
        if (h1 < h3) 
        { 
            return true; 
        } 
    } 
  
    // No triplet found, hence return false 
    return false; 
} 
  
// Driver code
public static void main(String[] args)
{
      
    // Given array 
    int arr[] = { 4, 7, 5, 6 }; 
  
    // Function call 
    if (findTriplet(arr))
    { 
        System.out.println("Yes");
    } 
    else
    { 
        System.out.println("No"); 
    } 
}
}
  
// This code is contributed by divyeshrabadiya07


Python3
# Python3 program for the above approach
import sys
  
# Function to check if there exist
# triplet in the array such that
# i < j < k and arr[i] < arr[k] < arr[j]
def findTriplet(arr):
    n = len(arr)
    st = []
  
    # Initialize the heights of h1 and h3
    # to INT_MAX and INT_MIN respectively
    h3 = -sys.maxsize - 1
    h1 = sys.maxsize
      
    for i in range(n - 1, -1, -1):
  
        # Store the current element as h1
        h1 = arr[i]
  
        # If the element at top of stack
        # is less than the current element
        # then pop the stack top
        # and keep updating the value of h3
        while (len(st) > 0 and st[-1] < arr[i]):
            h3 = st[-1]
            del st[-1]
  
        # Push the current element
        # on the stack
        st.append(arr[i])
  
        # If current element is less
        # than h3, then we found such
        # triplet and return true
        if (h1 < h3):
            return True
          
    # No triplet found, hence 
    # return false
    return False
  
# Driver Code
if __name__ == '__main__':
  
    # Given array
    arr = [ 4, 7, 5, 6 ]
  
    # Function Call
    if (findTriplet(arr)):
        print("Yes")
    else:
        print("No")
  
# This code is contributed by mohit kumar 29


C#
// C# program for the above approach 
using System;
using System.Collections.Generic;
  
class GFG{
      
// Function to check if there exist 
// triplet in the array such that 
// i < j < k and arr[i] < arr[k] < arr[j] 
public static bool findTriplet(int[] arr) 
{ 
    int n = arr.Length;
    Stack st = new Stack();
  
    // Initialize the heights of h1 and h2 
    // to INT_MAX and INT_MIN respectively 
    int h3 = int.MinValue;
    int h1 = int.MaxValue; 
  
    for(int i = n - 1; i >= 0; i--) 
    { 
          
        // Store the current element as h1 
        h1 = arr[i]; 
  
        // If the element at top of stack 
        // is less than the current element 
        // then pop the stack top 
        // and keep updating the value of h3 
        while (st.Count != 0 && st.Peek() < arr[i])
        { 
            h3 = st.Peek(); 
            st.Pop(); 
        } 
  
        // Push the current element 
        // on the stack 
        st.Push(arr[i]); 
  
        // If current element is less 
        // than h3, then we found such 
        // triplet and return true 
        if (h1 < h3) 
        { 
            return true; 
        } 
    } 
  
    // No triplet found, hence return false 
    return false; 
} 
  
// Driver code
public static void Main(String[] args)
{
      
    // Given array 
    int []arr = { 4, 7, 5, 6 }; 
  
    // Function call 
    if (findTriplet(arr))
    { 
        Console.WriteLine("Yes");
    } 
    else
    { 
        Console.WriteLine("No"); 
    } 
}
}
  
// This code is contributed by PrinciRaj1992


输出:
Yes

时间复杂度: O(N)
辅助空间: O(N)

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live