给定整数流,查找给定整数x的等级。整数插播广告的排名为“小于或等于x(不包括x)的元素总数”。
如果在流中找不到元素或元素在流中最小,则返回-1。
例子:
Input : arr[] = {10, 20, 15, 3, 4, 4, 1}
x = 4;
Output : Rank of 4 in stream is: 3
There are total three elements less than
or equal to x (and not including x)
Input : arr[] = {5, 1, 14, 4, 15, 9, 7, 20, 11},
x = 20;
Output : Rank of 20 in stream is: 8
一个相对简单的实现方法是使用一个数组,该数组按排序顺序保存所有元素。当插入一个新元素时,我们将移动这些元素。然后,我们在数组上执行二进制搜索以获取x的最右边的索引并返回该索引。 getRank(x)可以在O(log n)中使用,但是插入会很昂贵。
一种有效的方法是使用二进制搜索树。每个节点将保留其左子树的数据值和大小。
我们从根开始遍历树并将根值与x进行比较。
- 如果root-> data == x,则返回root的左子树的大小。
- 如果x
data,返回getRank(root-> left) - 如果x> root-> data,则返回getRank(root-> right)+ leftSubtree的大小+ 1。
下面是解决方案。
C++
// CPP program to find rank of an
// element in a stream.
#include
using namespace std;
struct Node {
int data;
Node *left, *right;
int leftSize;
};
Node* newNode(int data)
{
Node *temp = new Node;
temp->data = data;
temp->left = temp->right = NULL;
temp->leftSize = 0;
return temp;
}
// Inserting a new Node.
Node* insert(Node*& root, int data)
{
if (!root)
return newNode(data);
// Updating size of left subtree.
if (data <= root->data) {
root->left = insert(root->left, data);
root->leftSize++;
}
else
root->right = insert(root->right, data);
return root;
}
// Function to get Rank of a Node x.
int getRank(Node* root, int x)
{
// Step 1.
if (root->data == x)
return root->leftSize;
// Step 2.
if (x < root->data) {
if (!root->left)
return -1;
else
return getRank(root->left, x);
}
// Step 3.
else {
if (!root->right)
return -1;
else {
int rightSize = getRank(root->right, x);
if(rightSize == -1 ) return -1;
return root->leftSize + 1 + rightSize;
}
}
}
// Driver code
int main()
{
int arr[] = { 5, 1, 4, 4, 5, 9, 7, 13, 3 };
int n = sizeof(arr) / sizeof(arr[0]);
int x = 4;
Node* root = NULL;
for (int i = 0; i < n; i++)
root = insert(root, arr[i]);
cout << "Rank of " << x << " in stream is: "
<< getRank(root, x) << endl;
x = 13;
cout << "Rank of " << x << " in stream is: "
<< getRank(root, x) << endl;
x = 8;
cout << "Rank of " << x << " in stream is: "
<< getRank(root, x) << endl;
return 0;
}
Java
// Java program to find rank of an
// element in a stream.
class GfG {
static class Node {
int data;
Node left, right;
int leftSize;
}
static Node newNode(int data)
{
Node temp = new Node();
temp.data = data;
temp.left = null;
temp.right = null;
temp.leftSize = 0;
return temp;
}
// Inserting a new Node.
static Node insert(Node root, int data)
{
if (root == null)
return newNode(data);
// Updating size of left subtree.
if (data <= root.data) {
root.left = insert(root.left, data);
root.leftSize++;
}
else
root.right = insert(root.right, data);
return root;
}
// Function to get Rank of a Node x.
static int getRank(Node root, int x)
{
// Step 1.
if (root.data == x)
return root.leftSize;
// Step 2.
if (x < root.data) {
if (root.left == null)
return -1;
else
return getRank(root.left, x);
}
// Step 3.
else {
if (root.right == null)
return -1;
else {
int rightSize = getRank(root.right, x);
if(rightSize == -1) return -1;
return root.leftSize + 1 + rightSize;
}
}
}
// Driver code
public static void main(String[] args)
{
int arr[] = { 5, 1, 4, 4, 5, 9, 7, 13, 3 };
int n = arr.length;
int x = 4;
Node root = null;
for (int i = 0; i < n; i++)
root = insert(root, arr[i]);
System.out.println("Rank of " + x + " in stream is : "+getRank(root, x));
x = 13;
System.out.println("Rank of " + x + " in stream is : "+getRank(root, x));
}
}
Python3
# Python3 program to find rank of an
# element in a stream.
class newNode:
def __init__(self, data):
self.data = data
self.left = self.right = None
self.leftSize = 0
# Inserting a new Node.
def insert(root, data):
if root is None:
return newNode(data)
# Updating size of left subtree.
if data <= root.data:
root.left = insert(root.left, data)
root.leftSize += 1
else:
root.right = insert(root.right, data)
return root
# Function to get Rank of a Node x.
def getRank(root, x):
# Step 1.
if root.data == x:
return root.leftSize
# Step 2.
if x < root.data:
if root.left is None:
return -1
else:
return getRank(root.left, x)
# Step 3.
else:
if root.right is None:
return -1
else:
rightSize = getRank(root.right, x)
if rightSize == -1:
# x not found in right sub tree, i.e. not found in stream
return -1
else:
return root.leftSize + 1 + rightSize
# Driver code
if __name__ == '__main__':
arr = [5, 1, 4, 4, 5, 9, 7, 13, 3]
n = len(arr)
x = 4
root = None
for i in range(n):
root = insert(root, arr[i])
print("Rank of", x, "in stream is:",
getRank(root, x))
x = 13
print("Rank of", x, "in stream is:",
getRank(root, x))
x = 8
print("Rank of", x, "in stream is:",
getRank(root, x))
# This code is contributed by PranchalK
C#
// C# program to find rank of an
// element in a stream.
using System;
class GFG
{
public class Node
{
public int data;
public Node left, right;
public int leftSize;
}
static Node newNode(int data)
{
Node temp = new Node();
temp.data = data;
temp.left = null;
temp.right = null;
temp.leftSize = 0;
return temp;
}
// Inserting a new Node.
static Node insert(Node root, int data)
{
if (root == null)
return newNode(data);
// Updating size of left subtree.
if (data <= root.data)
{
root.left = insert(root.left, data);
root.leftSize++;
}
else
root.right = insert(root.right, data);
return root;
}
// Function to get Rank of a Node x.
static int getRank(Node root, int x)
{
// Step 1.
if (root.data == x)
return root.leftSize;
// Step 2.
if (x < root.data)
{
if (root.left == null)
return -1;
else
return getRank(root.left, x);
}
// Step 3.
else
{
if (root.right == null)
return -1;
else
{
int rightSize = getRank(root.right, x);
if(rightSize == -1) return -1;
return root.leftSize + 1 + rightSize;
}
}
}
// Driver code
public static void Main(String[] args)
{
int []arr = { 5, 1, 4, 4, 5, 9, 7, 13, 3 };
int n = arr.Length;
int x = 4;
Node root = null;
for (int i = 0; i < n; i++)
root = insert(root, arr[i]);
Console.WriteLine("Rank of " + x +
" in stream is : " +
getRank(root, x));
x = 13;
Console.WriteLine("Rank of " + x +
" in stream is : " +
getRank(root, x));
}
}
// This code is contributed by PrinciRaj1992
C++
// C++ program to find rank of an
// element in a stream.
#include
using namespace std;
// Driver code
int main()
{
int a[] = {5, 1, 14, 4, 15, 9, 7, 20, 11};
int key = 20;
int arraySize = sizeof(a)/sizeof(a[0]);
int count = 0;
for(int i = 0; i < arraySize; i++)
{
if(a[i] <= key)
{
count += 1;
}
}
cout << "Rank of " << key << " in stream is: "
<< count-1 << endl;
return 0;
}
// This code is contributed by
// Ashwin Loganathan.
Java
// Java program to find rank of an
// element in a stream.
class GFG
{
// Driver code
public static void main(String[] args)
{
int a[] = {5, 1, 14, 4, 15, 9, 7, 20, 11};
int key = 20;
int arraySize = a.length;
int count = 0;
for(int i = 0; i < arraySize; i++)
{
if(a[i] <= key)
{
count += 1;
}
}
System.out.println("Rank of " + key +
" in stream is: " + (count - 1));
}
}
// This code has been contributed by 29AjayKumar
Python3
# Python3 program to find rank of an
# element in a stream.
# Driver code
if __name__ == '__main__':
a = [5, 1, 14, 4, 15,
9, 7, 20, 11]
key = 20
arraySize = len(a)
count = 0
for i in range(arraySize):
if a[i] <= key:
count += 1
print("Rank of", key,
"in stream is:", count - 1)
# This code is contributed by PranchalK
C#
// C# program to find rank of an
// element in a stream.
using System;
class GFG
{
// Driver code
public static void Main()
{
int []a = {5, 1, 14, 4, 15, 9, 7, 20, 11};
int key = 20;
int arraySize = a.Length;
int count = 0;
for(int i = 0; i < arraySize; i++)
{
if(a[i] <= key)
{
count += 1;
}
}
Console.WriteLine("Rank of " + key +
" in stream is: " +
(count - 1));
}
}
// This code is contributed by
// Akanksha Rai
PHP
输出
Rank of 4 in stream is: 3
Rank of 13 in stream is: 8
Rank of 8 in stream is: -1
另一种方法:
从头开始遍历数组。遍历时,对等于或小于给定键的节点计数,打印count(Rank)。
C++
// C++ program to find rank of an
// element in a stream.
#include
using namespace std;
// Driver code
int main()
{
int a[] = {5, 1, 14, 4, 15, 9, 7, 20, 11};
int key = 20;
int arraySize = sizeof(a)/sizeof(a[0]);
int count = 0;
for(int i = 0; i < arraySize; i++)
{
if(a[i] <= key)
{
count += 1;
}
}
cout << "Rank of " << key << " in stream is: "
<< count-1 << endl;
return 0;
}
// This code is contributed by
// Ashwin Loganathan.
Java
// Java program to find rank of an
// element in a stream.
class GFG
{
// Driver code
public static void main(String[] args)
{
int a[] = {5, 1, 14, 4, 15, 9, 7, 20, 11};
int key = 20;
int arraySize = a.length;
int count = 0;
for(int i = 0; i < arraySize; i++)
{
if(a[i] <= key)
{
count += 1;
}
}
System.out.println("Rank of " + key +
" in stream is: " + (count - 1));
}
}
// This code has been contributed by 29AjayKumar
Python3
# Python3 program to find rank of an
# element in a stream.
# Driver code
if __name__ == '__main__':
a = [5, 1, 14, 4, 15,
9, 7, 20, 11]
key = 20
arraySize = len(a)
count = 0
for i in range(arraySize):
if a[i] <= key:
count += 1
print("Rank of", key,
"in stream is:", count - 1)
# This code is contributed by PranchalK
C#
// C# program to find rank of an
// element in a stream.
using System;
class GFG
{
// Driver code
public static void Main()
{
int []a = {5, 1, 14, 4, 15, 9, 7, 20, 11};
int key = 20;
int arraySize = a.Length;
int count = 0;
for(int i = 0; i < arraySize; i++)
{
if(a[i] <= key)
{
count += 1;
}
}
Console.WriteLine("Rank of " + key +
" in stream is: " +
(count - 1));
}
}
// This code is contributed by
// Akanksha Rai
的PHP
输出:
Rank of 20 in stream is: 8