//组数的人数的最小值的最大
//原理:1.将得到的数从小到大排序
//2.在已经插入数的数列中寻找满足条件且该数列的长度最小
//3.如果不满足条件,就另开一个数列
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e5+10;
int cnt;//记录已经开启数列的个数
struct Range{
int len,a;
}range[N];
int a[N];
void insert(int x)
{
bool flag=false;//记录有没有找到符合要求的数列
int l=0x3f3f3f3f,idx;
for(int i=0;i<cnt;++i)
{
if(range[i].a==x-1)
{
if(range[i].len<l)//找到一个符合条件最短的数列加入
{
l=range[i].len;
idx=i;
flag=true;
}
}
}
if(flag)//更新该数列的下标
{
range[idx].len++;
range[idx].a=x;
}else//不符合条件就另开数组
{
range[cnt].len=1;
range[cnt].a=x;
cnt++;
}
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
for(int i=0;i<n;i++) insert(a[i]);
int ans=0x3f3f3f3f;
for(int i=0;i<cnt;++i)
ans=min(ans,range[i].len);
cout<<ans;
return 0;
}