使用 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错误。

请建议我如何改进这一点。谢谢

使用 c# 的可编码性前缀集

您可以使用集合跟踪您已经观察到的所有元素。

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)额外的空间。