【发布时间】:2021-05-28 07:34:58
【问题描述】:
我有以下问题:-
写一个函数:
class Solution { public int solution(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] 范围内的整数。
现在我尝试了这段代码:-
using System;
// you can also use other imports, for example:
// using System.Collections.Generic;
// you can write to stdout for debugging purposes, e.g.
// Console.WriteLine("this is a debug message");
class Solution
{
public int solution(int[] A)
{
// write your code in C# 6.0 with .NET 4.5 (Mono)
int n = 1;
Array.Sort(A);
for (int i = 1; i <= 100000; i++)
{
for (int i2 = 0; i2 <= A.Length - 1; i2++)
{
if (A[i2] == i)
{
n = A[i2] + 1;
break;
}
}
}
return n;
}
}
我的代码在这些测试数据上运行良好:-
A = [1, 2, 3]
A = [-1, -3]
虽然失败了:-
A = [1, 3, 6, 4, 1, 2] 返回 7 而不是 5。
有什么建议为什么我的代码在第三次测试中失败了?
谢谢
【问题讨论】:
-
@TimSchmelter 所以有什么建议可以解决这个问题吗?
-
最好的方法不是(1)像你已经做的那样排序,(2)二进制印章以找到值 1 或 1 所在的最近位置。 (3) 从该索引开始线性搜索以找到第一个“差距”(处理缺少 1 的情况,因此是答案)
-
@MatthewWatson 能否提供示例代码
-
我只是认为这样会更好,但是对 N 的限制让我得出结论,有一个更好更聪明的算法。这值得考虑更多。
-
内部 (
i2) 循环检测i是否是A数组的一部分。一旦找到,它就会中断,然后下一个i会被占用。这里的问题是外循环总是运行到完成,所以在某些时候i是 6,而内循环找到了一个匹配项,覆盖了n的正确值。您可能想在分配新值之前检查n的 current 值,看看是否存在差距? (注意我不是在这里讨论效率)