在整数数组中查找一对元素,使abs(v[i]-v[j])最小化

Find pair of elements in integer array such that abs(v[i]-v[j]) is minimized

本文关键字:最小化 abs 数组 整数 查找 元素      更新时间:2023-10-16

假设我们有一个包含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个forS找到它。问题是,有没有任何算法可以用一个且只有一个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;
}}