【发布时间】:2019-04-14 11:05:23
【问题描述】:
我需要打印一个 int 数组的任意两个元素之间的最小差异。
数组A的每个元素都小于等于它的长度。
1 <= A[i] <= A.length;
我已经在 Java 中尝试了以下给出的方法 - 但是当给定数组大小 ~10^5 时,这需要超过 1 秒才能找到结果。
我认为这可能是一种幼稚的做法。有什么办法可以进一步优化吗?
可以在O(n)时间复杂度内完成吗?
static int findResult(int[] arr)
{
int max = Integer.MAX_VALUE;
HashSet<Integer> hs = new HashSet<Integer>();
for(int obj : arr)
{
hs.add(obj);
}
if(hs.size()==1 )
{
return 0; // if all elements are same
}
for(int i=0; i<arr.length; i++)
{
for(int j=i+1; j<arr.length; j++)
{
int value = Math.abs(a[i]-a[j]);
if(value<max)
{
max = value;
}
}
}
return max; // returns the smallest positive difference
}
【问题讨论】:
-
您可以对数组进行排序,然后寻找最小的差异,这总是在当前项和下一项之间。
-
它在少数情况下会起作用。像 1 2 5 7 1. 排序 - 1 1 2 5 7. 但会失败(最坏情况) - 5 2 3 1 5. 排序 -1 2 3 5 5. 无论如何谢谢 :)
-
不,无论如何,从那以后你迭代“连续”元素,每次都计算差异。
标签: algorithm optimization array-algorithms