找出值在数组中“适合”的位置?

时间:2013-10-08 22:28:42

标签: arrays algorithm loops logic

我遇到的问题应该是一个非常简单的算法,但由于某些原因,我的头部工作不正常(工作太多了?)

我有一个数值数组:[10,20,30,40,100,1000,5000,100000]我想检查哪个是数组中的下一个“项目”。

例如,

  • 给定数字10,我的算法应返回10.
  • 给定数字1,我​​的算法应返回10
  • 给出数字50,我的算法应返回100.
  • 给定数字99999999,我的算法应返回100000

在伪代码中我在想:

for previousValue, nextValue in values: 
  if ( previousValue < value && nextValue >= value ):
    return nextValue
return values[max]

如果有人能指出我精疲力竭的大脑,那么我会错过它。谢谢!

4 个答案:

答案 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?

中查看