从数组中查找最小-最大对
Finding MIN MAX pairs from array
给定一个由N个整数组成的排序数组,我需要找到所有具有不同索引的对(i!=j)
。我需要具有(j>i)
的所有对中的最大(a[j]+a[i]-1)
和最小(a[j]-a[i]+1)
。数字不是唯一的,但它们的配对是允许的。数字不能与自己配对。
我现在在做什么:
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
MAX= max(MAX,a[j] + a[i] -1);
MIN=min(MIN,a[j]-a[i]+1);
}
}
这给出了O(n^2)的时间复杂性。有没有办法把它降到O(nlogn)甚至更低?
要找到max,只需要添加索引n-1和n-2处的元素,因为数组已经排序,最大的2个元素将只在数组的末尾。阵列中没有其他元素会比这些元素大,因此它们的总和也会比任何其他元素的总和大。
MAX = a[n-1] + a[n-2] - 1;
时间复杂性:O(1)
要查找min,您应该在数组中查找pivot。我选择从[0]开始。如果空间不是一个约束,请创建另一个大小相似的数组,并使用数据透视中的delta值填充它。
int[] b = new int[n];
for(int i=1; i<n; i++)
{
b[i] = a[i] - a[0];
}
现在,第二个数组将具有数据透视中的delta值。你只需要找到数组b的最小值和下一个最小值的索引。这2个值将是最接近的值,因此它们的差异也将最小。
时间复杂度:O(n)+O(n
空间复杂性:O(n)必须创建一个相同大小的新数组。
相关文章:
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- 需要使用模板查找数组的第二个最小和最小值
- 用于查找数组中最大元素的出现次数的代码,给出分段错误
- 查找数组中指示性较大但数组中值较小的元素
- C++ 函数,用于查找数组中四个最小最大元素的总和不起作用
- 查找数组中的最小数字
- 查找数组中重复(重复)数字的索引
- 使用一个内存集数组和单个堆栈在 O(n) 中查找数组的下一个更大元素
- 查找数组中给定数字的出现次数
- 使用 std::累加来查找数组的总和
- 代码以查找数组中的最大数字,但它仅将第一个数字显示为最大数字. 有人请告诉我为什么
- 在不进行排序的情况下查找数组中n个最小值的索引
- 当数组在C++中用作参数时,查找数组的元素数
- 查找数组中数组元素的重复出现?
- 查找数组最后 3 个数字的平均值
- 查找数组中是否存在C++元素
- 查找数组中的最小更改数以进行 k 算术级数
- 查找数组的第一个和最后一个索引,其中 from 和 to 元素的顺序总和最大
- 有没有办法在递归中使用指针来查找数组的最小值?
- 在编写代码以查找数组中的对数时获取分段错误