如何从给定的数字数组中找到给定数字的前趋?
例如,如果给定的数组包含
-2,1,0,3
左,输入数字为0
,则前任为-2
。
我写了以下代码:
public static int getPredecessor(int[] inpArr, int key) {
int minDiff = key<=0 ? (key-inpArr[0]) : key;
int predecessor = key;
for(int i=0;i<inpArr.length;i++) {
if(inpArr[i] < key && (key - inpArr[i])<=minDiff)
{
minDiff = key - inpArr[i];
predecessor = inpArr[i];
}
}
return predecessor;
}
我所做的基本上是跟踪所提供的数字与数组中每个数字之间的最小差异;无论何时遇到最小差异,阵列中的特定数字都存储为前一个。如果最终的return语句将返回与输入数字相同的数字,那么这意味着在给定的数组中找不到前导。
我的问题是:
可以以任何方式优化代码吗?它在O(n)时间和O(1)空间复杂度下运行。
答案 0 :(得分:2)
对于未排序数组的单个查询(如示例数组所示),O(N)时间是最好的,因为必须与数组中的每个元素进行比较。
首先对数组进行排序将花费O(N log N)时间,但是,如果预期对阵列上的许多查询,则可以在O(log N)时间内通过二进制搜索来完成每个查询。因此,如果有足够的查询,查询的平均成本可能低于O(N)。
或者,如果预期许多查询使用相同的小(ish)键值集,则使用例如哈希表来记忆每个键的结果最终将提供每个平均O(1)性能以O(N)空间为代价进行查询。
答案 1 :(得分:0)
上述代码不适用于inpArr = [ - 5,-2]和key = -4,inpArr = [ - 5,-2,-3],key = + 1等情况。所以纠正了它。这是更正后的代码。
public static int getPredecessorv2(int[] inpArr, int key) {
int minDiff = Math.abs(key);
int pred = key;
if(inpArr[0] < key) {
minDiff = key - inpArr[0];
pred = inpArr[0];
}
for(int i=0;i<inpArr.length;i++) {
if(inpArr[i] < key && (key - inpArr[i])<=minDiff)
{
minDiff = key - inpArr[i];
pred = inpArr[i];
}
}
return pred;
}