从存储右侧较大元素计数的数组生成原始数组
给定一个整数数组greater[],其中数组的每个值都表示未知数组arr[]中右侧有多少个元素大于其右侧。我们的任务是生成原始数组 arr[]。可以假设原始数组包含从 1 到 n 范围内的元素,并且所有元素都是唯一的
例子:
Input : greater[] = { 6, 3, 2, 1, 0, 0, 0 }
Output : arr[] = [ 1, 4, 5, 6, 7, 3, 2 ]
Input : greater[] = { 0, 0, 0, 0, 0 }
Output : arr[] = [ 5, 4, 3, 2, 1 ]
我们考虑一个元素数组 temp[] = {1, 2, 3, 4, .. n}。我们知道大于 [0] 的值表示大于 arr[0] 的元素计数。我们可以观察到 temp[] 的第 (n – greater[0]) 个元素可以放在 arr[0] 处。所以我们把它放在 arr[0] 并从 temp[] 中删除它。我们对剩余元素重复上述过程。对于每个更大的元素[i],我们将 temp[] 的第 (n – greater[i] – i) 个元素放入 arr[i] 并将其从 temp[] 中删除。
下面是上述想法的实现
C++
// C++ program to generate original array
// from an array that stores counts of
// greater elements on right.
#include
using namespace std;
void originalArray(int greater[], int n)
{
// Array that is used to include every
// element only once
vector temp;
for (int i = 0; i <= n; i++)
temp.push_back(i);
// Traverse the array element
int arr[n];
for (int i = 0; i < n; i++) {
// find the K-th (n-greater[i]-i)
// smallest element in Include_Array
int k = n - greater[i] - i;
arr[i] = temp[k];
// remove current k-th element
// from Include array
temp.erase(temp.begin() + k);
}
// print resultant array
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
}
// driver program to test above function
int main()
{
int Arr[] = { 6, 3, 2, 1, 0, 1, 0 };
int n = sizeof(Arr) / sizeof(Arr[0]);
originalArray(Arr, n);
return 0;
}
Java
// Java program to generate original array
// from an array that stores counts of
// greater elements on right.
import java.util.Vector;
class GFG
{
static void originalArray(int greater[], int n)
{
// Array that is used to include every
// element only once
Vector temp = new Vector();
for (int i = 0; i <= n; i++)
temp.add(i);
// Traverse the array element
int arr[] = new int[n];
for (int i = 0; i < n; i++)
{
// find the K-th (n-greater[i]-i)
// smallest element in Include_Array
int k = n - greater[i] - i;
arr[i] = temp.get(k);
// remove current k-th element
// from Include array
temp.remove(k);
}
// print resultant array
for (int i = 0; i < n; i++)
System.out.print(arr[i] + " ");
}
// Driver code
public static void main(String[] args)
{
int Arr[] = { 6, 3, 2, 1, 0, 1, 0 };
int n = Arr.length;
originalArray(Arr, n);
}
}
// This code is contributed by Rajput-Ji
Python3
# Python3 program original array from an
# array that stores counts of greater
# elements on right
def originalArray(greater, n):
# array that is used to include
# every element only once
temp = []
for i in range(n + 1):
temp.append(i)
# traverse the array element
arr = [0 for i in range(n)]
for i in range(n):
# find the Kth (n-greater[i]-i)
# smallest element in Include_array
k = n - greater[i] - i
arr[i] = temp[k]
# remove current kth element
# from include array
del temp[k]
for i in range(n):
print(arr[i], end = " ")
# Driver code
arr = [6, 3, 2, 1, 0, 1, 0]
n = len(arr)
originalArray(arr, n)
# This code is contributed
# by Mohit Kumar
C#
// C# program to generate original array
// from an array that stores counts of
// greater elements on right.
using System;
using System.Collections.Generic;
class GFG
{
static void originalArray(int []greater, int n)
{
// Array that is used to include every
// element only once
List temp = new List();
for (int i = 0; i <= n; i++)
temp.Add(i);
// Traverse the array element
int []arr = new int[n];
for (int i = 0; i < n; i++)
{
// find the K-th (n-greater[i]-i)
// smallest element in Include_Array
int k = n - greater[i] - i;
arr[i] = temp[k];
// remove current k-th element
// from Include array
temp.RemoveAt(k);
}
// print resultant array
for (int i = 0; i < n; i++)
Console.Write(arr[i] + " ");
}
// Driver code
public static void Main()
{
int []Arr = { 6, 3, 2, 1, 0, 1, 0 };
int n = Arr.Length;
originalArray(Arr, n);
}
}
/* This code contributed by PrinciRaj1992 */
Javascript
输出:
1 4 5 6 7 2 3
时间复杂度: (n 2 )(擦除操作在向量中需要 O(n))