使用 c# 的可编码性前缀集
本文关键字:前缀 编码 使用 | 更新日期: 2023-09-27 17:56:45
问题描述:
给定一个表 A 的 N 个从 0 到 N-1 的整数,计算最小的 这样的索引 P,即 {A[0],...,A[N-1]} = {A[0],...,A[P]}。
我的解决方案
using System;
using System.Linq;
using System.Collections.Generic;
class Solution {
public int solution(int[] A) {
for (int i=A.Length-1;i>=0;i--) {
int[] Am = A.Take(i).ToArray();
int pos = Array.IndexOf(Am, A[i]);
if( pos >- 1 )
{
}
else
{
return i;
}
}
return A.Length-1;
}
}
这有效,但复杂性为 O(N**2),当数组具有大量元素时超时
如果我用long
代替int
,我得到cs0266 cannot implicitly convert long to int
错误。
请建议我如何改进这一点。谢谢
您可以使用集合跟踪您已经观察到的所有元素。
public Int32 Solution(Int32[] A)
{
var seenNumbers = new HashSet<Int32>();
var result = 0;
for (var index = 0; index < A.Length; index++)
{
if (seenNumbers.Add(A[index]))
{
result = index;
}
}
return result;
}
请注意,如果元素尚未在集合中,则HashSet<T>.Add()
将返回 true,否则返回 false。当你第一次发现一个数字时,你显然必须包括这个数字,因此将前缀扩展到当前位置。这将在O(n)
中运行并占用O(n)
额外的空间。