在整数数组中查找一对元素,使abs(v[i]-v[j])最小化
Find pair of elements in integer array such that abs(v[i]-v[j]) is minimized
假设我们有一个包含5个元素的int数组:1、2、3、4、5
我需要做的是找到数组元素减法的最小abs值:
我们需要像那样检查
1-2 2-3 3-4 4-5
1-3 2-4 3-5
1-4 2-5
1-5
求出这些减法的最小绝对值。我们可以用2个for
S找到它。问题是,有没有任何算法可以用一个且只有一个for
找到值?
对列表进行排序,并减去最近的两个元素
可证明性能最佳的解决方案是非线性的线性O(n)直到常数因子。
这意味着所花费的时间与数组中元素的数量成比例(这当然是我们能做的最好的事情,因为我们至少必须读取数组中的每个元素,这已经花费了O(n)时间)。
这里有一个这样的O(n)解决方案(如果列表可以修改,它也使用O(1)空间):
int mindiff(const vector<int>& v)
{
IntRadixSort(v.begin(), v.end());
int best = MAX_INT;
for (int i = 0; i < v.size()-1; i++)
{
int diff = abs(v[i]-v[i+1]);
if (diff < best)
best = diff;
}
return best;
}
IntRadixSort是一种线性时间固定宽度整数排序算法,定义如下:
http://en.wikipedia.org/wiki/Radix_sort
其概念是,通过在比特位置上的一系列固定过程中对int进行拍卖,可以利用int的固定比特宽度特性。即在高位(第32位)对它们进行分区,然后在次高位(第31位),然后在下一位(第30位),依此类推——这只需要线性时间。
这个问题相当于排序。可以使用任何排序算法,并在最后返回最近元素之间的差。对数据进行最后一次遍历可以用来找到差异,也可以在排序过程中保持差异。在对数据进行排序之前,相邻元素之间的最小差异将是上限。
因此,要在没有两个循环的情况下进行排序,请使用没有两个环路的排序算法。在某种程度上,这感觉像是语义,但递归排序算法只需要一个循环。如果这个问题是简单的双循环情况所需的n(n+1)/2减法,那么可以使用O(n-logn)算法。
否,除非您知道列表已排序,否则您需要两个
它在for循环中的简单迭代
keep 2 variable "minpos and maxpos " and " minneg" and "maxneg"
check for the sign of the value you encounter and store maximum positive in maxpos
and minimum +ve number in "minpos" do the same by checking in if case for number
less than zero. Now take the difference of maxpos-minpos in one variable and
maxneg and minneg in one variable and print the larger of the two . You will get
desired.
我相信you definitely know how to find max and min in one for loop
correction :- The above one is to find max difference in case of minimum you need to
take max and second max instead of max and min :)
这可能会对您有所帮助:
end=4;
subtractmin;
m=0;
for(i=1;i<end;i++){
if(abs(a[m]-a[i+m])<subtractmin)
subtractmin=abs(a[m]-a[i+m];}
if(m<4){
m=m+1
end=end-1;
i=m+2;
}}
- 找到两对数字,使它们的乘积的绝对差最小化
- 我可以做些什么来消除或最小化这种将提供相同功能和行为的代码重复
- 超轻 - 如何最小化窗口
- 在C++中使用 GSL 最小化
- 在C++中最小化变量的范围
- 当只有一个线程主要使用该对象而其他线程很少使用它时,如何最小化该对象的互斥锁锁定?
- "最小化"按钮不会出现在 MFC 对话框中
- 从小于或等于某个 N 的数字列表中最小化或找到 n 个理想的子集和
- 如何排列二进制字符串以最小化它们之间的距离
- 最小化 C++ 中的内存使用
- 禁用 GPO 的空气抖动最小化
- 如何隐藏最大化和最小化按钮并在qml应用程序窗口中显示关闭按钮?
- 如何使用 stl 最小化 c++ 中所有打开的窗口
- 如何最小化嵌入式平台上的内存分配
- 可见程序或最小化程序时的过程ID更改
- 删除/最小化GIT合并冲突
- 当模式窗口最小化时,最小化所有应用程序窗口(在 Linux 上)
- 应用程序最小化时单击显示桌面/最小化全部
- 如何在Qt中打开外部应用程序并将其最小化到系统托盘
- 在整数数组中查找一对元素,使abs(v[i]-v[j])最小化