📌  相关文章
📜  为数组中的每个元素找到最接近的较大值

📅  最后修改于: 2021-05-24 23:56:06             🧑  作者: Mango

给定一个整数数组,为每个元素找到最接近的更大元素。如果没有更大的元素,则打印-1

例子:

一个简单的解决方案是运行两个嵌套循环。我们一个接一个地选择一个外部元素。对于每个拾取的元素,我们遍历剩余的数组并找到最接近的较大元素。该解决方案的时间复杂度为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)