当前位置: 首页 > 知识库问答 >
问题:

求数组中不出现的最小正整数

石博艺
2023-03-14

我正在尝试以下练习来提高我的在线技能,我遇到了以下问题。

这是一个演示任务。

编写一个函数:class Solution{public int Solutions(int[]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)。

<?php

class Solution {
    public function($A) {
        $posInts = [1, 2, 3, 4, 5, 6, 7, 8, 9];
        $diffs = array_diff($postInts, $A);
        $smallestPosInt = min($diffs);
        return $smallestPosInt;
    }
}

现在我很不确定我在这里做错了什么,或者我如何用更好的算法重写代码。

共有3个答案

冯永长
2023-03-14

查看这个答案,使用Javascript以一种具有最佳性能的方式工作-如果我没有弄错-O(N)。

function solution(A) {
  const set = new Set(A)
  let i = 1

  while (set.has(i)) {
    i++
  }
  return i
}
马阳晖
2023-03-14

如果允许我们修改输入,请就地执行此操作,否则创建一个大小为n 1的新数组

对于原始数组中遇到的每个元素,如果它大于n 1或小于1,则在元素的索引处分配0(如果就地执行,则索引为-1);否则,在数组的索引处为值赋值1,如果不同,则在其自己的索引处赋值0。然后运行第二次遍历,并报告第一个大于零的索引(如果就地执行,则为索引1),值为0或n1。

[1, 3, 6, 4, 1, 2]

=>

[1, 1, 1, 1, 0, 1]

report 5
施靖
2023-03-14

我只会循环(递增)任何可能的整数:

function solution($A) {
    $result = 1;
    $maxNumber = max($A);
    for (; $result <= $maxNumber; $result++) {
        if (!in_array($result, $A)) {
            break;
        }
    }
    return $result;
}

var_dump(solution([1, 3, 6, 4, 1, 2])); // int(5)
var_dump(solution([1, 2, 3])); // int(4)
var_dump(solution([-1, -3])); // int(1)

// As a bonus, this also works for larger numbers:
var_dump(solution([1, 3, 6, 4, 1, 2, 7, 8, 9, 10, 11, 12, 13, 5, 15])); // int(14)

关于性能的编辑:

正如评论中指出的那样(你自己已经说过了),这不是一个非常有效的解决方案。

虽然我目前没有足够的时间进行真正的性能测试,但我认为这应该接近O(n)解决方案:(记住,我不确定数组是如何在PHP的C端实现的)

function solution($A) {
    $result = 1;
    $maxNumber = max($A);
    $values = array_flip($A);
    for (; $result <= $maxNumber; $result++) {
        if (!isset($values[$result])) {
            break;
        }
    }
    return $result;
}
// Not posting the output again because it is naturally the same ;) 

这里的“技巧”是首先翻转数组,使值成为索引。因为a)我们不关心原始索引,b)我们不关心重复值是否会相互覆盖,所以我们可以安全地这样做。

使用isset()代替in_array()应该要快得多,因为它基本上只检查变量(在本例中存储在数组的特定索引中)是否存在,因此PHP不必迭代数组来检查我们循环的每个数字是否存在于其中。

P.S.:经过三思,我认为这可能仍然更接近O(n*2),因为max()可能会循环找到最大值。您也可以删除该行,只需检查PHP中作为紧急出口的最高数字,如下所示: 对于(; $result

 类似资料:
  • 我正在尝试解决一个leetcode类型问题,这是一个实践问题,它伴随着即将到来的代码测试,我需要为工作做一个,我遇到了麻烦。任何人都可以帮助我了解出了什么问题? 我基本上是在寻找暴力选项,因为我不知道algos/DS。 编写一个函数: 功能溶液(A); 给定一个包含 N 个整数的数组 A,返回 A 中未出现的最小正整数(大于 0)。 例如,给定A = [1,3,6,4,1,2],函数应该返回5。

  • 我试图解决下面提供的Codness中的一个问题, 编写一个函数: 给定一个由N个整数组成的数组A,返回A中不出现的最小正整数(大于0)。 例如,给定A=[1,3,6,4,1,2],函数应该返回5。 假定: N是范围[1...100,000]内的整数;数组A的每个元素都是范围[−1,000,000..1,000,000]内的整数。 预期最坏情况时间复杂度为O(N);预计最坏情况下的空间复杂度为O(N

  • 我有以下问题 写一个函数: 给定一个包含N个整数的数组A,返回A中没有出现的最小正整数(大于0)。 例如,给定 A = [1, 3, 6, 4, 1, 2],函数应返回 5。 给定A = [1,2,3],函数应该返回4。 给定A =[1,3],该函数应返回1。 为以下假设编写有效的算法: N是[1..100000]范围内的整数 数组A的每个元素都是范围内的整数[−1000000..1000000]

  • 编写一个函数: 函数解($ 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]范围内的整数

  • 所以...我有:int array[]={-8,2,0,5,-3,6,0,9}; 我想找到一个最小的正数(在上面的列表中是2)