问题描述:
给定从0到N-1的N个整数的表A计算最小值 这样的指数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)并且当Array具有大量元素时会超时
如果我使用long
代替int
,我会收到cs0266 cannot implicitly convert long to int
错误。
请建议我如何改善这一点。感谢
答案 0 :(得分:1)
您可以使用集合跟踪已经观察过的所有元素。
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)
个额外空间。