【问题标题】:Smallest integer that is not present in the array数组中不存在的最小整数
【发布时间】:2017-09-27 19:04:47
【问题描述】:

写一个函数:

函数解($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),超出输入存储(不计算输入参数所需的存储)。 可以修改输入数组的元素。

我的尝试:

function solution($A) {
    $b=min($A);
    $c=max($A);
     for($i=$b; $i<=$c;$i++){
         if($b>0){
                if($b!=1){
                    return 1;
                    }else{
                        for($x=1;$x<=$c;$x++){
                            $b=1;
                            $b=$b+$x;
                            if(!in_array($b,$A)){
                                return $b;
                                }
                        }
                    }
         }else if($b<0 && $c<0){
             return 1;
             }else if($b<0 && $c>0){
                 //was working on this case..
                 }
        //echo $test.'<br>';
    }
}

根据结果,这次尝试的正确率是 40%。

【问题讨论】:

  • 您确定要寻找最小的正整数吗?你的结果没有告诉你的要求,请检查这些例如,给定 A = [1, 3, 6, 4, 1, 2],函数应该返回 5。另一个例子,给定 A = [1, 2, 3] ,函数应该返回 4。给定 A = [−1, −3],函数应该返回 1。
  • 对于数组的不同情况,函数必须返回不属于该数组的最小可能整数。 @MoeenBasra
  • ['−1', '−3',4,'-5'] 的输出应该是什么?
  • 1,因为我们正在寻找最小的正整数,并且 ans 不应该等于 0。@RavinderReddy
  • 从1开始,在数组中吗?是-> 加 1 并重复。不->这就是你的答案。

标签: php arrays algorithm


【解决方案1】:

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

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

【讨论】:

  • 这个答案是最干净的,并且对于实际任务是正确的。但鉴于这是一个包含预计最坏情况时间复杂度为 O(N) 的面试问题,如果它被拒绝,我不会感到惊讶。 in_array 是 O(N),for 循环也是 O(N);总共 O(N^2)。预期的解决方案可能类似于$tmp=array_flip($A);for($i=1;isset($tmp[$i]);$i++);return $i;。他们可以声称array_flip 是 O(n)(实际上不是),而 isset 是 O(1)(实际上不是) b>)。
【解决方案2】:
function solution($A) {
  $a = array_flip($A);
  for($i=1; isset($a[$i]);$i++);
  return $i;
}

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

【讨论】:

  • 这是我推荐和使用的,但这个答案缺少教育解释。对于寻求算法建议的问题,解释为什么你的答案是最好的并用“科学”来支持你的主张是明智的。
  • 这个解决方案应该是公认的答案。
【解决方案3】:

正如我所见,您只需要最小的值,如果是这种情况,试试这个:

$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];

希望对你有帮助

【讨论】:

    【解决方案4】:

    检查此代码。

    // 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);
    

    【讨论】:

    • max_number = max($array) +1 如果数组是 [1, 2, 3, 4]
    • 这个答案的计算效率不高。 max() 迭代整个数组。当效率很重要时,通常不会在循环中调用in_array()!in_array() 还迭代整个数组。
    【解决方案5】:

    这是我的想法

    $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);
    

    【讨论】:

    • 每次迭代都调用max() 是一种浪费。此答案缺少教育解释。
    【解决方案6】:

    准确率 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];
    }
    

    【讨论】:

    • 这个答案缺少教育解释。
    • 这个 sn-p 工作太辛苦了。 array_diff() 将迭代和比较两个数组(不必要的)! array_values() 是不必要的——只需在$diff 上致电reset()current()
    【解决方案7】:

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

    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
    ?>
    

    【讨论】:

    • 如果您从不修改$value,为什么它可以通过引用进行修改?此实现不会竞争最低的计算复杂度,因为您进行了迭代的max() 调用。 Ankit 早在几年前就演示了使用 isset() 来利用 php 数组的哈希映射特性,并且没有任何 max() 调用。
    • 首先,这是我写过的第一个 PHP 代码,所以我可能不知道所有的语法细节。您是在谈论 $value 之前的 & 吗?另外,你在说什么 max() ?它正在比较两个数字:biggestvalue。它没有迭代任何东西。我错过了什么?这个解决方案的逻辑在任何情况下都是 O(n)。
    • 对于max(num1, num2),我基本上是在尝试这样做:$biggest = ($biggest &lt; $value) ? $value : $biggest;。如果后一个三元组比在两个数字上运行max() 更具执行性,那么我可以使用三元组。不过,我看不出这会是什么,只是一个微不足道的差异。我想到了 JavaScript 中的 Math.max(num1, num2)。 php 中的max(num1, num2) 不是在做同样的事情吗?
    • 还值得一提的是,我的回答并没有试图提供(并且发问者也没有要求)“竞争最低计算复杂度”的解决方案,无论这意味着什么。这只是 Javascript 中的 O(n) 解决方案。您投了反对票,因为它不在 PHP 中,所以我添加了一个 PHP 解决方案。而且我不明白为什么“竞争最低的计算复杂度”不值得反对。并不是每一个好的解决方案都会最大限度地降低“计算复杂度”。
    • 不知何故我没有看到还有一个PHP sn-p,当我第一次访问时我只注意到js sn-p(可能在滚动时我认为第一个sn-p是一部分另一个答案)。无论如何,Ankit 的回答表明没有必要进行迭代比较。基本上不需要第一个循环。 $biggest 不是必需的。使用array_flip() 创建一个唯一值数组作为查找数组。第二个循环已经发布在页面上——所以我不能举起我的 DV,因为我告诉研究人员这个答案与赞成的解决方案相比相形见绌。
    【解决方案8】:

    查看此 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;
    }
    

    【讨论】:

    • 这个问题被明确标记为php。将此答案移植到等效的 Java 页面,或者提出并自行回答需要 Java 解决方案的新问题。
    猜你喜欢
    • 2022-01-20
    • 2019-03-22
    • 1970-01-01
    • 2013-06-27
    • 2017-04-03
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多