例如,在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))中,是否可能?
答案 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;
}
}
}