数组中不存在的最小整数

时间:2017-09-27 19:04:48

标签: php arrays algorithm

写一个函数:

功能解决方案($ A);

给定N个整数的数组A,返回A中没有出现的最小正整数(大于0)。

例如,给定A = [1,3,6,4,1,2],函数应返回5.

另一个例子,给定A = [1,2,3],函数应返回4.

给定A = [-1,-3],函数应返回1.

假设:

N是[1..100,000]范围内的整数; 数组A的每个元素都是[-1,000,000..1,000,000]范围内的整数。 复杂度:

预期的最坏情况时间复杂度为O(N); 预期的最坏情况空间复杂度是O(N),超出输入存储(不计入输入参数所需的存储)。 可以修改输入数组的元素。

8 个答案:

答案 0 :(得分:7)

function solution($A) {
  $a = array_flip($A);
  for($i=1; isset($a[$i]);$i++);
  return $i;
}

100%性能得分的解决方案!!

答案 1 :(得分:4)

不确定您在代码中尝试做什么,但从1开始,检查并增加。只要在数组中找不到$i,循环就会停止:

function solution($A) {
    for($i=1; in_array($i, $A); $i++);
    return $i;
}

答案 2 :(得分:0)

我可以看到你只需要所有的最小值,如果是这样的话,试试这个:

$cantArray = count($A); // size of the array
$smaller = 0; // Just the position

    for($f = 1; $f < $cantArray; $f++){ 
        if($A[$f] > 0){ 
            if($A[$f] < $A[$smaller]){ 
                $smaller = $f;  
            }
        }
    }


    // At the end just print the smallest
    echo $A[$smaller];

希望有所帮助

答案 3 :(得分:0)

检查此代码。

// your array 
$array =  [1, 3, 6, 4, 1, 2];
// define an empty array.
$new_array = array();
// get the max value from your array
$max_number = max($array);
// loop
for($i=1;$i<$max_number;$i++){
    // check for existence in your array  
    if(!in_array($i,$array)){
      // save to new array
      $new_array[]=$i;  
    }
}
echo $small_int = empty($new_array) ? $max_number+1 : min($new_array);

答案 4 :(得分:0)

这就是我的想法

$array = [];

for($i=-100; $i<100; $i++) {
    $array[] = rand(-100, 100);
    $i++;
}

$newArray = array_filter($array, function($number) {
    return $number > 0;
});


function getSmallesPositiveNumber($array) {
    for($i=0; $i<=max($array); $i++) {
        if (in_array($i+1, $array)) {
            continue;
        }

        return $i+1;
    }
}

print_r($newArray);
echo getSmallesPositiveNumber($newArray);

答案 5 :(得分:0)

查看此Java代码。

 public static int solution(int[] a){
    Arrays.sort(a); //O(nlogn)
    int answer = 1; // O(1)
    int positiveCounter = 1; // O(1)
    for (int i = 0; i<=a.length; i++){
        answer = positiveCounter;
        if(i == a.length){
            break;
        }
        if(a[i]<=0){
            continue;
        }
        if(a[i] != positiveCounter){
            break;
        }
        if(i == a.length-1){
            positiveCounter++;
            answer = positiveCounter;
            break;
        }
        if(a[i+1] != positiveCounter){
            positiveCounter++;
        }

    }
    return answer;
}

答案 6 :(得分:0)

准确度88%

function solution($A) {
    $max = max($A);
     if($max < 0){
        $max = 1;
     }
    $range = range(1,$max+1);
    $diff = array_diff($range,$A);
    $diff = array_values($diff);
    return $diff[0];
}

答案 7 :(得分:0)

提示没有说数组是有序的,所以你不能只是递增。您也不想重复进行线性搜索,因为数组可能很大。存储在哈希集之类的东西中(用于快速查找),并跳过负数:

PHP 实现:

<?php
  function solution(array $arr) {
    $set = [];

    foreach ($arr as $value) {
      if ($value > 0) {
        $set[$value] = $value;
      }
    }

    for ($i = 1; isset($set[$i]); $i++);

    return $i;
  }


  echo solution(array(1, 3, 6, 4, 1, 2));//5
  echo solution(array(1, 2, 3));//4
  echo solution(array(-1, -2));//1
?>