我遇到的问题应该是一个非常简单的算法,但由于某些原因,我的头部工作不正常(工作太多了?)
我有一个数值数组:[10,20,30,40,100,1000,5000,100000]我想检查哪个是数组中的下一个“项目”。
例如,
在伪代码中我在想:
for previousValue, nextValue in values:
if ( previousValue < value && nextValue >= value ):
return nextValue
return values[max]
如果有人能指出我精疲力竭的大脑,那么我会错过它。谢谢!
答案 0 :(得分:0)
假设数组已经排序,您的解决方案可以正常工作。但为了更清楚,我会将其改写如下:
prev = 0
for(v in values){
if(target > prev && target <= v)
return v
prev = v
}
return values[values.length-1]
答案 1 :(得分:0)
在红宝石中:
find 0,values.length,val
def find left,right,val
if left == right || left > right then return values[left]
if val > values[(right + left)/2]
find (right + left)/2, right, val
else
find left, (right + left)/2, val
end
end
答案 2 :(得分:0)
无需对数组进行排序。排序数组具有O(nlogn)时间复杂度。您可以在θ(n)时间内检查数组中的每个元素。
假设数组为arr
且比较项为item
且数组arr
包含至少一个大于或等于item
的元素:
在java中
public static int find_greater(int[] arr,int item)
{
int j=0;
int previous =0;
for(int i=0;i<arr.length;i++){
if(arr[i]>=item){
if(j==0){
previous = arr[i];
}else{
if(arr[i]<previous)
{
previous = arr[i];
}
}
j++;
}
}
return previous;
}
这里我遍历数组并保留一个变量previous
,它是大于或等于item
的最小数字。
此过程的运行时间为theta(N)
,其中N为arr.length
。
答案 3 :(得分:0)
我可能会将此数组表示为树。 为了找出最接近的最大值,我将以与查找密钥相同的方式查看树,并始终跟踪我最接近的值。当我到达节点的末尾时,我返回最接近的值。
与其他答案相比,这是另一种选择。您可以在此帖子How to find the closest element to a given key value in a binary search tree?
中查看