给定整数数组,为每个元素找到最接近的较小元素。如果没有较小的元素,则打印-1
例子:
Input : arr[] = {10, 5, 11, 6, 20, 12}
Output : 6, -1, 10, 5, 12, 11
Input : arr[] = {10, 5, 11, 10, 20, 12}
Output : 5 -1 10 5 12 11
一个简单的解决方案是运行两个嵌套循环。我们一个接一个地选择一个外部元素。对于每个拾取的元素,我们遍历剩余的数组并找到最接近的较小元素。该解决方案的时间复杂度为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)