我正在尝试以下练习来提高我的在线技能,我遇到了以下问题。
这是一个演示任务。
编写一个函数: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;
}
}
现在我很不确定我在这里做错了什么,或者我如何用更好的算法重写代码。
查看这个答案,使用Javascript以一种具有最佳性能的方式工作-如果我没有弄错-O(N)。
function solution(A) {
const set = new Set(A)
let i = 1
while (set.has(i)) {
i++
}
return i
}
如果允许我们修改输入,请就地执行此操作,否则创建一个大小为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
我只会循环(递增)任何可能的整数:
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)