计算数组右侧和左侧较大元素的最佳方法

时间:2017-02-10 10:39:52

标签: php arrays code-complexity

例如,在php中

$arr = [9, 4, 3, 5, 2, 6];

然后,

$output = [[0,0], [1,2], [2,2], [1,1], [4,1], [1,0]];

[0,0] = 9的较大元素在两侧都是0

[1,2] = 4的较大元素是左边的1(9)和右边的2(5,6)... [9]。 4] - [5] 4,6> 4]

[2,2] = 3的较大元素是左边的2(9,4)和右边的2(5,6)

[1,1] = 5的较大元素是左边的1(9)和右边的1(6)

[4,1] = 2(9,4,3,5)中较大的元素左边是4,右边是1(6)

[1,0] = 6的较大元素是左边的1(9)和右边的0(6之后没有元素)

我希望它在O(n log(n))中,是否可能?

5 个答案:

答案 0 :(得分:0)

您需要遍历$arr以获取每个值,然后在循环中再次循环$arr以获取其他值。然后,在第二个循环中,通过比较value(以确定数字是否确实更大)和key来构建输出数组(以了解它是否已开启)左边或右边。)

$arr = array(9, 4, 3, 5, 2, 6);
$output = array();
foreach ($arr as $key=>$value) {
    $out = array(0, 0);
    foreach ($arr as $key2=>$value2) {
        if ($key2 == $key) # If it's the same element
            continue;
        if ($value2 > $value) {
            if ($key2 < $key)
                $out[0]++;
            else
                $out[1]++;
        }
    }
    $output[] = $out;
}

print_r($output);

请参阅输出here

答案 1 :(得分:0)

试试这个:

function fix_array($array) {
    $return_array = array();

    foreach ($array as $i => $value){
        $left = array_slice($array, 0, $i);

        $count_left = count(array_filter($left, function($var) use($value){
            return $var > $value;
        }));

        $right = array_slice($array, $i + 1);

        $count_right = count(array_filter($right, function($var) use($value){
            return $var > $value;
        }));

        $return_array[] = [$count_left, $count_right];

    }

    return $return_array;
}

$arr = [9, 4, 3, 5, 2, 6];

$new_array = fix_array($arr);

print_r($new_array);

答案 2 :(得分:0)

只需将其与左右值进行比较即可。试试这个:

$arr = [9, 4, 3, 5, 2, 6];
$total = count($arr);

$new_arr=array();
foreach ($arr as $key => $value) {
  $left = 0;
  $right = 0;
  for ($i=0; $i < $total; $i++) { 
    if($key > $i && $arr[$i] > $arr[$key])
    {
      $left++;
    }
    elseif ($key < $i && $arr[$i] > $arr[$key]) {
      $right++;
    }
  }
  $new_arr[]=[$left,$right];

}
echo "<pre>";
print_r($new_arr);

答案 3 :(得分:0)

使用array_walk()

尝试以下代码
<?php

$arr = [9, 4, 3, 5, 2, 6];

$finalArray =[];
array_walk($arr, function($value,$key) use(&$finalArray,&$arr) {

$param ['pre_val']=0;
$param ['post_val']=0;
$param ['current_index'] = $key;
$param ['current_value'] = $value;
$arr2 = $arr;
array_walk($arr2, function(&$value,$key) use(&$finalArray,&$param) {
    if($key < $param['current_index']){
        if($value > $param['current_value']){$param['pre_val'] ++;}
    }else{
        if($value > $param['current_value']){$param['post_val'] ++;}
    }
    $finalArray[$param['current_index']][0] = $param['pre_val'];
    $finalArray[$param['current_index']][1] = $param['post_val'];
  });
});


print_r($finalArray);

答案 4 :(得分:0)

看起来已经有很多答案了,你可以用一些数组函数来做这些,比如一些答案,但是因为这可能是你的功课最好的保持简单。我通过使用$ side变量跟踪每次迭代应该增加的是左边还是右边。

$arr = [9, 4, 3, 5, 2, 6];
$results = [];
for ($x = 0; $x < count($arr); $x++) {
    $results[$x] = [0,0];
    $side = 0;
    for ($y = 0; $y < count($arr); $y++) {
        if ($arr[$y] > $arr[$x]) {
            $results[$x][$side]++;
        } elseif ($arr[$x] == $arr[$y]) {
            $side = 1;
        }
    }
}