给定一个整数数组,为每个元素找到最接近的更大元素。如果没有更大的元素,则打印-1
例子:
Input : arr[] = {10, 5, 11, 6, 20, 12}
Output : 11 6 12 10 -1 20
Input : arr[] = {10, 5, 11, 10, 20, 12}
Output : 11 10 12 11 -1 20
一个简单的解决方案是运行两个嵌套循环。我们一个接一个地选择一个外部元素。对于每个拾取的元素,我们遍历剩余的数组并找到最接近的较大元素。该解决方案的时间复杂度为O(n * n)
更好的解决方案是使用排序。我们对所有元素进行排序,然后对每个元素向右遍历,直到找到更大的元素(请注意,一个元素可能会多次出现)。
一个有效的解决方案是使用自我平衡BST(按照C++中的设置和Java的TreeSet的实现)。在自平衡BST中,我们可以在O(Log n)时间执行插入操作和最接近的较大操作。
C++
// C++ program to find closest greater value
// for every array element
#include
using namespace std;
void closetGreater(int arr[], int n)
{
// Insert all array elements into a Set
set ts;
for (int i = 0; i < n; i++)
ts.insert(arr[i]);
// Find smallest greater element for
// every array element
for (int i = 0; i < n; i++)
{
auto greater = ts.upper_bound(arr[i]);
if (greater == ts.end())
cout << -1 << " ";
else
cout << *greater << " ";
}
}
// Driver code
int main(int argc, char const *argv[])
{
int arr[] = {10, 5, 11, 10, 20, 12};
int n = sizeof(arr) / sizeof(arr[0]);
closetGreater(arr, n);
return 0;
}
// This code is contributed by
// sanjeev2552
Java
// Java program to find closest greater value for
// every array element
import java.util.*;
class TreeSetDemo {
public static void closestGreater(int[] arr)
{
// Insert all array elements into a TreeSet
TreeSet ts = new TreeSet();
for (int i = 0; i < arr.length; i++)
ts.add(arr[i]);
// Find smallest greater element for every
// array element
for (int i = 0; i < arr.length; i++) {
Integer greater = ts.higher(arr[i]);
if (greater == null)
System.out.print(-1 + " ");
else
System.out.print(greater + " ");
}
}
public static void main(String[] args)
{
int[] arr = { 10, 5, 11, 10, 20, 12};
closestGreater(arr);
}
}
输出:
11 10 12 11 -1 20
时间复杂度:O(n Log n)