import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
long[] a = new long[n];
for (int i = 0; i < n; i++) {
a[i] = scanner.nextLong();
}
System.out.println(minOperations(a, n));
scanner.close();
}
private static Long minOperations(long[] a, int n) {
// 情况1:如果数组中所有元素已经相同,返回0
if (allElementsSame(a, n)) {
return 0L;
}
// 检查数组中是否包含0
boolean hasZero = false;
for (long num : a) {
if (num == 0) {
hasZero = true;
break;
}
}
// 情况2:如果数组元素不相同且不包含0,则不可能完成,返回-1
if (!hasZero) {
return -1L;
}
// 收集所有正整数并去重
Set<Long> positiveNumbers = new HashSet<>();
for (long num : a) {
if (num > 0) {
positiveNumbers.add(num);
}
}
// 将去重后的正整数转换为列表并排序
List<Long> positives = new ArrayList<>(positiveNumbers);
Collections.sort(positives);
// 正整数的个数使用int类型
int m = positiveNumbers.size();
// 最大的正整数
long maxP = positives.get(m - 1);
// 应用公式计算结果:maxP - (m - 1)
return maxP - (m - 1);
}
// 检查数组是否所有元素都相同
private static boolean allElementsSame(long[] a, int n) {
if (n <= 1) {
return true; // 空数组或只有1个元素,自然所有元素相同
}
long first = a[0]; // 以第一个元素为基准
for (int i = 1; i < n; i++) {
if (a[i] != first) { // 只要有一个元素与基准不同,就返回false
return false;
}
}
return true; // 所有元素都与基准相同,返回true
}
}