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

📅  最后修改于: 2021-04-29 07:37:50             🧑  作者: Mango

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

例子:

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

高效的方法:为了优化上述方法,其思想是使用堆栈在数组arr []中的每个元素的右侧保持较小元素的轨迹。步骤如下:

  • 从末尾遍历数组,并维护一个堆栈,该堆栈以降序存储该元素。
  • 要按递减顺序维护堆栈,请弹出小于当前元素的元素。然后将弹出的元素标记为三元组的第三个元素。
  • 如果任何元素小于最后弹出的元素(标记为三元组的第三个元素),则反向遍历数组。然后,它们存在一个满足给定条件的三元组,并打印“是”
  • 否则打印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)