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

时间:2012-03-29 19:29:57

标签: c++ c arrays

假设我们有一个包含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

找到这些减法的最小abs值。我们可以用2 for找到它。问题是,是否有任何算法可以用for来查找价值?

6 个答案:

答案 0 :(得分:1)

对列表进行排序并减去最接近的两个元素

答案 1 :(得分:1)

可证明性能最佳的解是渐近线性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

这个概念是你通过在位位置上的一系列固定传递中将它们分区来利用整数的固定位宽性质。即将它们分配到hi位(第32位),然后是下一个最高位(第31位),然后是下一个(第30位),依此类推 - 只需要线性时间。

答案 2 :(得分:0)

问题相当于排序。可以使用任何排序算法,最后返回最近元素之间的差异。可以使用对数据的最终传递来查找该差异,或者可以在排序期间维护该差异。在对数据进行排序之前,相邻元素之间的最小差异将是上限。

因此,如果没有两个循环,请使用没有两个循环的排序算法。在某种程度上它感觉像语义,但递归排序算法将只用一个循环。如果此问题是简单的两个循环情况所需的n(n + 1)/ 2次减法,则可以使用O(n log n)算法。

答案 3 :(得分:-1)

不,除非您知道列表已排序,否则您需要两个

答案 4 :(得分:-1)

它在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 :)

答案 5 :(得分:-1)

这可能会对您有所帮助:

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;
}}