📜  查找数组中每个元素的相对排名

📅  最后修改于: 2021-10-26 06:39:46             🧑  作者: Mango

给定一个由N 个整数组成的数组A[] ,任务是找到给定数组中每个元素的相对排名

例子:

朴素方法:想法是为每个元素生成最长的递增子序列,然后每个元素的相对等级是(LIS 的长度 – 1)

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

有效的方法:为了优化上述方法,想法是使用堆栈并以非递减的顺序从右边存储元素直到每个元素(比如A[i] )然后每个A[i]的排名是(堆栈大小 – 1)直到该元素。下面是相同的插图:

下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
using namespace std;
  
// Function to find relative rank for
// each element in the array A[]
void findRank(int A[], int N)
{
    // Create Rank Array
    int rank[N] = {};
  
    // Stack to store numbers in
    // non-decreasing order from right
    stack s;
  
    // Push last element in stack
    s.push(A[N - 1]);
  
    // Iterate from second last
    // element to first element
    for (int i = N - 2; i >= 0; i--) {
  
        // If current element is less
        // than the top of stack and
        // push A[i] in stack
        if (A[i] < s.top()) {
  
            s.push(A[i]);
  
            // Rank is stack size - 1
            // for current element
            rank[i] = s.size() - 1;
        }
        else {
  
            // Pop elements from stack
            // till current element is
            // greater than the top
            while (!s.empty()
                   && A[i] >= s.top()) {
                s.pop();
            }
  
            // Push current element in Stack
            s.push(A[i]);
  
            // Rank is stack size - 1
            rank[i] = s.size() - 1;
        }
    }
  
    // Print rank of all elements
    for (int i = 0; i < N; i++) {
        cout << rank[i] << " ";
    }
}
  
// Driver Code
int main()
{
    // Given array A[]
    int A[] = { 1, 2, 3, 5, 4 };
  
    int N = sizeof(A) / sizeof(A[0]);
  
    // Function call
    findRank(A, N);
    return 0;
}


Java
// Java program to implement
// the above approach
import java.io.*;
import java.util.*;
import java.lang.*;
  
class GFG{
      
// Function to find relative rank for
// each element in the array A[]
static void findRank(int[] A, int N)
{
      
    // Create Rank Array
    int[] rank = new int[N];
  
    // Stack to store numbers in
    // non-decreasing order from right
    Stack s = new Stack();
  
    // Push last element in stack
    s.add(A[N - 1]);
  
    // Iterate from second last
    // element to first element
    for(int i = N - 2; i >= 0; i--)
    {
          
        // If current element is less
        // than the top of stack and
        // push A[i] in stack
        if (A[i] < s.peek()) 
        {
            s.add(A[i]);
  
            // Rank is stack size - 1
            // for current element
            rank[i] = s.size() - 1;
        }
        else
        {
  
            // Pop elements from stack
            // till current element is
            // greater than the top
            while (!s.isEmpty() && 
                    A[i] >= s.peek())
            {
                s.pop();
            }
  
            // Push current element in Stack
            s.add(A[i]);
  
            // Rank is stack size - 1
            rank[i] = s.size() - 1;
        }
    }
  
    // Print rank of all elements
    for(int i = 0; i < N; i++) 
    {
        System.out.print(rank[i] + " ");
    }
}
  
// Driver Code
public static void main(String[] args)
{
      
    // Given array A[]
    int A[] = { 1, 2, 3, 5, 4 };
  
    int N = A.length;
  
    // Function call
    findRank(A, N);
}
}
  
// This code is contributed by sanjoy_62


Python3
# Python3 program for the above approach
  
# Function to find relative rank for
# each element in the array A[]
def findRank(A, N):
      
    # Create Rank Array
    rank = [0] * N
  
    # Stack to store numbers in
    # non-decreasing order from right
    s = []
  
    # Push last element in stack
    s.append(A[N - 1])
  
    # Iterate from second last
    # element to first element
    for i in range(N - 2, -1, -1):
  
        # If current element is less
        # than the top of stack and
        # append A[i] in stack
        if (A[i] < s[-1]):
            s.append(A[i])
  
            # Rank is stack size - 1
            # for current element
            rank[i] = len(s) - 1
  
        else:
  
            # Pop elements from stack
            # till current element is
            # greater than the top
            while (len(s) > 0 and A[i] >= s[-1]):
                del s[-1]
  
            # Push current element in Stack
            s.append(A[i])
  
            # Rank is stack size - 1
            rank[i] = len(s) - 1
  
    # Print rank of all elements
    for i in range(N):
        print(rank[i], end = " ")
          
# Driver Code
if __name__ == '__main__':
  
    # Given array A[]
    A = [ 1, 2, 3, 5, 4 ]
  
    N = len(A)
  
    # Function call
    findRank(A, N)
  
# This code is contributed by mohit kumar 29


C#
// C# program to implement
// the above approach
using System;
using System.Collections.Generic;
using System.Linq;
  
class GFG{
      
// Function to find relative rank for
// each element in the array A[]
static void findRank(int[] A, int N)
{
      
    // Create Rank Array
    int[] rank = new int[N];
  
    // Stack to store numbers in
    // non-decreasing order from right
    Stack s = new Stack();
  
    // Push last element in stack
    s.Push(A[N - 1]);
  
    // Iterate from second last
    // element to first element
    for(int i = N - 2; i >= 0; i--)
    {
  
        // If current element is less
        // than the top of stack and
        // push A[i] in stack
        if (A[i] < s.Peek())
        {
            s.Push(A[i]);
  
            // Rank is stack size - 1
            // for current element
            rank[i] = s.Count() - 1;
        }
        else
        {
  
            // Pop elements from stack
            // till current element is
            // greater than the top
            while (s.Count() != 0 && 
                   A[i] >= s.Peek())
            {
                s.Pop();
            }
  
            // Push current element in Stack
            s.Push(A[i]);
  
            // Rank is stack size - 1
            rank[i] = s.Count() - 1;
        }
    }
  
    // Print rank of all elements
    for(int i = 0; i < N; i++)
    {
        Console.Write(rank[i] + " ");
    }
}
  
// Driver Code
public static void Main()
{
      
    // Given array A[]
    int[] A = new int[] { 1, 2, 3, 5, 4 };
  
    int N = A.Length;
  
    // Function call
    findRank(A, N);
}
}
  
// This code is contributed by sanjoy_62


输出:
3 2 1 0 0


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