PHP:数组中连续元素的数量

时间:2015-02-19 18:28:53

标签: php arrays algorithm

我一直在研究一个问题:

查找数组中最大的连续数字组。

假设我们有一个数组[5, 43, 4, 56, 3, 2, 44, 57, 58, 1],这个数组中最大的一组连续数字是5(1,2,3,4和5)。

求解算法必须是O(n)的时间复杂度。

我已使用以下ruby代码解决了这个问题,但是我无法将其移植到PHP,因为解决方案需要。

arr = [8, 13, 14, 10, 6, 7, 8, 14, 5, 3, 5, 2, 6, 7, 4]
result = []
stage = []
for i in arr:
    if len(stage) > 0 and i != stage[-1]+1:
        if len(stage) > 1:
            result.append(stage)
        stage = []
    stage.append(i)
print result

3 个答案:

答案 0 :(得分:5)

它不是O(n),但你可以试试这个:

// Define array
$array = array(5,8,3,2,10,11,15,13,12,1,4,5,16);

// Sorting
asort($array);

$previous = null; 
$result = array();
$consecutiveArray = array();

// Slice array by consecutive sequences
foreach($array as $number) {
    if ($number == $previous + 1) {
        $consecutiveArray[] = $number;
    } else {
        $result[] = $consecutiveArray;
        $consecutiveArray = array($number);
    }
    $previous = $number;
}
$result[] = $consecutiveArray;

// Get length of each sub array
$count = array_map('count', $result);

您可以按max($count)获得最大长度。

此解决方案为您提供以下数组:

array(
    0 => array(1,2,3,4,5)
    1 => array(5)
    2 => array(8)
    3 => array(10,11,12,13)
    4 => array(15,16)

答案 1 :(得分:3)

$a = [8, 13, 14, 10, 6, 7, 8, 14, 5, 3, 5, 2, 6, 7, 4];

$res = [];
$stage = [];

foreach($a as $i) {
    if(count($stage) > 0 && $i != $stage[count($stage)-1]+1) {
        if(count($stage) > 1) {
            $res[] = $stage;
        }
        $stage = [];
    }
    $stage[] = $i;

}
print_r($res);

答案 2 :(得分:1)

这是一个python(我的PHP不太好),你的描述要求,o(n)你的序列是否正在减少:

lists = dict()
for i in val:
    if i in lists:
        continue
    a = {i}
    if (i + 1) in lists:
        b = lists[i+1]
        b.update(a)
        a = b
    if (i - 1) in lists:
        b = lists[i-1]
        # this messes up the complexity
        for k in b:
            lists[k] = a
        a.update(b)
    lists[i] = a

这个想法是lists维护列表中所有索引的集合的字典。每当遇到新元素时,合并前一个和下一个集合(如果存在)。

update操作在技术上是o(n),但它不会被外部循环复合,因为只能通过合并将n插入到集合中。整体为o(n)

如果序列没有排序,则+1和-1集的合并会给出不太好的复杂性。