给定一个数字流arr ,任务是在流中每个元素到达时按降序找到它们的排名。
Rank is defined as the total number of elements that is greater than the arriving element, where rank 1 defines the maximum value in the stream. Each value in the array is unique.
例子:
Input: arr = [88, 14, 69, 30, 29, 89]
Output: 1 2 2 3 4 1
Explanation:
First 88 arrives, so its rank is 1.
when 14 arrives, 14 is less than 88 so its rank is 2.
when 69 arrives, 69 is less than 88 and greater than 14 so its rank is 2.
when 30 arrives, 30 is less than 88 and 69 so its rank is 3.
when 29 arrives, 29 is less than 88, 69, 30 than 29 so its rank is 4.
when 89 arrives, 89 is greater than all values so its rank is 1.
The rank of elements of array 1 2 2 3 4 1
Input: arr = [100, 110, 80, 85, 88, 89]
Output: 1 1 3 3 3 3
Explanation:
First 100 arrive so its rank is 1.
when 110 arrive, 110 is greater than 100 so its rank is 1.
when 80 arrive, 80 is less than 110 and 100 so its rank is 3.
when 85 arrive, 85 is less than 110 and 100 so its rank is 3.
when 88 arrive, 88 is less than 110 and 100 so its rank is 3.
when 89 arrive, 89 is less than 110 and 100 so its rank is 3.
The rank of elements of array 1 1 3 3 3 3
天真的方法:
- 数组的第一个元素将始终具有排名 1。
- 遍历数组,如果该元素在前面的元素中最大,则其秩为 1。
- 如果元素不大于先前比较的元素。那么这个元素的排名将是它之前的更大元素的数量。
例如,假设它大于 2 个先前的元素,则其等级为 3。
下面是上述方法的实现:
C++
// C++ program to rank of all elements
// in a Stream in descending order
// when they arrive
#include
using namespace std;
// FindRank function to find rank
void FindRank(int arr[], int length)
{
// Rank of first element is always 1
cout << "1" << " ";
// Iterate over array
for (int i = 1; i < length; i++)
{
// As element let say its rank is 1
int rank = 1;
// Element is compared
// with previous elements
for (int j = 0; j < i; j++)
{
// If greater than previous
// than rank is incremented
if(arr[j] > arr[i])
rank++;
}
// print rank
cout << rank << " ";
}
}
// Driver code
int main() {
// array named arr
int arr[] = {88, 14, 69, 30, 29, 89};
// length of arr
int len = sizeof(arr)/sizeof(arr[0]);
FindRank(arr, len);
return 0;
}
// This code is contributed by AnkitRai01
Java
// Java program to rank of all elements
// in a Stream in descending order
// when they arrive
import java.util.*;
class GFG{
// FindRank function to find rank
static void FindRank(int arr[], int length)
{
// Rank of first element is always 1
System.out.print("1" + " ");
// Iterate over array
for (int i = 1; i < arr.length; i++)
{
// As element let say its rank is 1
int rank = 1;
// Element is compared
// with previous elements
for (int j = 0; j < i; j++)
{
// If greater than previous
// than rank is incremented
if(arr[j] > arr[i])
rank++;
}
// print rank
System.out.print(rank + " ");
}
}
// Driver code
public static void main(String args[]){
// array named arr
int arr[] = {88, 14, 69, 30, 29, 89};
// length of arr
int len = arr.length;
FindRank(arr, len);
}
}
// This code is contributed by AbhiThakur
Python3
# Python program to rank of all elements
# in a Stream in descending order
# when they arrive
# FindRank function to find rank
def FindRank(arr, length):
# Rank of first element is always 1
print(1, end =" ")
# Iterate over array
for i in range(1, length):
# As element let say its rank is 1
rank = 1
# Element is compared
# with previous elements
for j in range(0, i):
# If greater than previous
# than rank is incremented
if(arr[j] > arr[i]):
rank = rank + 1
# print rank
print(rank, end =" ")
# Driver code
if __name__ == '__main__':
# array named arr
arr = [88, 14, 69, 30, 29, 89]
# length of arr
length = len(arr)
FindRank(arr, length)
C#
// C# program to rank of all elements
// in a Stream in descending order
// when they arrive
using System;
class GFG{
// FindRank function to find rank
static void FindRank(int[] arr, int length)
{
// Rank of first element is always 1
Console.Write("1" + " ");
// Iterate over array
for (int i = 1; i < arr.Length; i++)
{
// As element let say its rank is 1
int rank = 1;
// Element is compared
// with previous elements
for (int j = 0; j < i; j++)
{
// If greater than previous
// than rank is incremented
if(arr[j] > arr[i])
rank++;
}
// print rank
Console.Write(rank + " ");
}
}
// Driver code
public static void Main(){
// array named arr
int[] arr = {88, 14, 69, 30, 29, 89};
// length of arr
int len = arr.Length;
FindRank(arr, len);
}
}
// This code is contributed by AbhiThakur
Javascript
Python3
# Python program to rank of all elements
# in a Stream in descending order
# when they arrive
# import of bisect to use bisect.insort()
import bisect
# FindRank function to find rank
def FindRank(arr, length):
# rank list to store values of
# array in ascending order
rank = []
first = arr[0]
rank.append(first)
# Rank of first element is always 1
print(1, end =" ")
# Iterate over remaining array
for i in range(1, length):
val = arr[i]
# element inserted in the rank list
# using the binary method
bisect.insort(rank, val)
# To find rank of that element
# length of rank array - index of element
# in rank array
eleRank = len(rank)-rank.index(val)
# print of rank of element of array
print(eleRank, end =" ")
# Driver code
if __name__ == '__main__':
# array named arr
arr = [88, 14, 69, 30, 29, 89]
# lenght of arr
length = len(arr)
FindRank(arr, length)
1 2 2 3 4 1
时间复杂度: O(N 2 ) ,其中 N 是数组的长度。
空间复杂度: O(1)
高效的方法:这个想法是使用二分搜索来找到数字的排名。它将给出大于给定数字的数字计数。
下面是上述方法的实现:
蟒蛇3
# Python program to rank of all elements
# in a Stream in descending order
# when they arrive
# import of bisect to use bisect.insort()
import bisect
# FindRank function to find rank
def FindRank(arr, length):
# rank list to store values of
# array in ascending order
rank = []
first = arr[0]
rank.append(first)
# Rank of first element is always 1
print(1, end =" ")
# Iterate over remaining array
for i in range(1, length):
val = arr[i]
# element inserted in the rank list
# using the binary method
bisect.insort(rank, val)
# To find rank of that element
# length of rank array - index of element
# in rank array
eleRank = len(rank)-rank.index(val)
# print of rank of element of array
print(eleRank, end =" ")
# Driver code
if __name__ == '__main__':
# array named arr
arr = [88, 14, 69, 30, 29, 89]
# lenght of arr
length = len(arr)
FindRank(arr, length)
1 2 2 3 4 1
时间复杂度: O(N * log N),其中 N 是数组的长度。
空间复杂度: O(N)
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live