c# - 返回 Array 中未出现的最小正整数(大于 0)
问题描述
我有以下问题:-
写一个函数:
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。
有什么建议为什么我的代码在第三次测试中失败了?
谢谢
解决方案
我将使用以下方法HashSet<int>
来检查是否缺少给定的整数:
public static int? SmallestMissing(int[] A, int rangeStart = 1, int rangeEnd = 100_000)
{
HashSet<int> hs = new HashSet<int>(A);
for (int i = rangeStart; i <= rangeEnd; i++)
if(!hs.Contains(i)) return i;
return null;
}
AHashSet
是唯一值的集合,并且在查找项目时非常有效(复杂度为O(1)
)。因此,您会以一些内存为代价获得一个非常易读且高效的算法。
也许您可以通过提供另一种算法来优化它,以防数组非常大,您不想冒险OutOfMemoryException
:
public static int? SmallestMissing(int[] A, int rangeStart = 1, int rangeEnd = 100_000)
{
if(A.Length > 1_000_000)
{
Array.Sort(A);
for (int i = rangeStart; i <= rangeEnd; i++)
{
int index = Array.BinarySearch(A, i);
if(index < 0) return i;
}
return null;
}
HashSet<int> hs = new HashSet<int>(A);
for (int i = rangeStart; i <= rangeEnd; i++)
if(!hs.Contains(i)) return i;
return null;
}
推荐阅读
- html - 有没有更好的方法将元素水平居中?
- identityserver4 - Identity Server 4 - 如何解决客户端注销后访问令牌仍然有效?
- java - 如何在方解石中遍历sqlNode
- javascript - Firestore/Javascript:FirebaseError:使用无效数据调用的函数 DocumentReference.set()。不支持的字段值:未定义
- c++ - 加载共享库时出错:libgmock.so:无法打开共享对象文件:没有这样的文件或目录
- c - 在 C 中打印数字金字塔,从顶部的最高数字开始
- android - 离子拦截传入的短信
- bash - 将 bash 脚本转换为 PowerShell
- css - CSS rotate3d 属性行为异常
- python - 如何在字符串中添加十六进制字节?