在数组中查找大于或等于N的数字

Tay*_*Mac 20 php arrays arraylist

如果我有一个PHP数组:

$array
Run Code Online (Sandbox Code Playgroud)

有价值:

45,41,40,39,37,31
Run Code Online (Sandbox Code Playgroud)

我有一个变量:

$number = 38;
Run Code Online (Sandbox Code Playgroud)

我怎样才能返回值?:

39
Run Code Online (Sandbox Code Playgroud)

因为这是数组中最接近38(向上计数)的值?

问候,

泰勒

far*_*jad 24

<?php
function closest($array, $number) {

    sort($array);
    foreach ($array as $a) {
        if ($a >= $number) return $a;
    }
    return end($array); // or return NULL;
}
?>
Run Code Online (Sandbox Code Playgroud)

  • 这是O(NLogN)解决方案,这可以在O(N)中执行. (4认同)
  • 如果你'复制/粘贴'代码,它将无法工作,因为我忘了在`return end($ array)`的末尾放一个分号.除此之外,它适用于您的输入(现在测试):). (2认同)
  • 此函数接受一个数组和一个数字,并将数组中最接近的值**大于或等于**指定给指定的数字.这就是OP所要求的. (2认同)

小智 10

这是一个获得所需结果并适用于任何数组数据的高级过程:

  • 过滤数组,保持大于或等于目标的值,然后选择最低的剩余值.这是"最佳"值(如果所有值都较小,则可能"无") - 这是O(n)
  • 或者,首先对数据进行排序,然后参见下文 - 这是O(n lg n)(希望如此)

现在,假设数组按ASCENDING排序,这种方法可行:

  • 循环遍历数组并找到大于或等于目标的第一个元素 - 这是O(n)

如果数组是DESCENDING(如在帖子中),请执行上述操作,但是:

  • 向后迭代- 这是O(n)
  • 首先将其排序(参见fardjad的回答) - 这是O(n lg n)(希望如此)
  • 迭代前进,但保持一个后视值(如果确切被跳过,记住"下一个最高") - 这是 O(n)

快乐的编码.


Jas*_*son 7

在array_search上编辑拼写错误

哟...似乎很容易.这是一个功能

<?php 
$array = array(45,41,40,39,37,31);

   function closest($array, $number){
    #does the array already contain the number?
    if($i = array_search( $number, $array)) return $i;

    #add the number to the array
    $array[] = $number;

    #sort and refind the number
    sort($array);
    $i = array_search($number, $array);

    #check if there is a number above it
    if($i && isset($array[$i+1])) return $array[$i+1];

    //alternatively you could return the number itself here, or below it depending on your requirements
    return null;
}
Run Code Online (Sandbox Code Playgroud)

跑步 echo closest($array, 38);