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

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

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

例子:

一个简单的解决方案是运行两个嵌套循环。我们一个接一个地选择一个外部元素。对于每个拾取的元素,我们遍历剩余的数组并找到最接近的较小元素。该解决方案的时间复杂度为O(n * n)

更好的解决方案是使用排序。我们对所有元素进行排序,然后对每个元素向左遍历,直到找到一个较小的元素(请注意,一个元素可能会多次出现)。

一个有效的解决方案是使用自我平衡BST(按照C++中的设置和Java的TreeSet的实现)。在自平衡BST中,我们可以在O(Log n)时间执行插入操作和最接近的较小操作。

C++
// C++ program to find closest smaller value for
// every array element
#include 
using namespace std;
  
void closestSmaller(int arr[], int n)
{
    // Insert all array elements into a TreeSet
    set ts;
    for (int i = 0; i < n; i++)
        ts.insert(arr[i]);
  
    // Find largest smaller element for every
    // array element
    for (int i = 0; i < n; i++)
    {
        auto smaller = ts.lower_bound(arr[i]);
        if (smaller == ts.begin())
            cout << -1 << " ";
        else
            cout << *(--smaller) << " ";
    }
}
  
// Driver Code
int main()
{
    int arr[] = {10, 5, 11, 6, 20, 12};
    int n = sizeof(arr) / sizeof(arr[0]);
  
    closestSmaller(arr, n);
  
    return 0;
}
  
// This code is contributed by
// sanjeev2552


Java
// Java program to find closest smaller value for
// every array element
import java.util.*;
  
class TreeSetDemo {
    public static void closestSmaller(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 largest smaller element for every
        // array element
        for (int i = 0; i < arr.length; i++) {
            Integer smaller = ts.lower(arr[i]);
            if (smaller == null)
                System.out.print(-1 + " ");
            else
                System.out.print(smaller + " ");
        }
    }
  
    public static void main(String[] args)
    {
        int[] arr = { 10, 5, 11, 6, 20, 12 };
        closestSmaller(arr);
    }
}


输出:
6 -1 10 5 12 11

时间复杂度:O(n Log n)