In an arithmetic progression, the difference between consecutive elements is constant. Since one value (not first or last) is missing, most consecutive differences will be equal except for one place where the gap is twice the common difference. By finding the smallest difference and locating the anomaly, we can recover the missing value.
classSolution {
public:int missingNumber(vector<int>& arr) {
int n = arr.size();
int d = min(arr[1] - arr[0], arr[2] - arr[1]);
for (int i =0; i < n -1; ++i) {
if (arr[i+1] - arr[i] != d) return arr[i] + d;
}
return-1;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
funcMissingNumber(arr []int) int {
n:= len(arr)
d:=arr[1] -arr[0]
ifarr[2]-arr[1] < d {
d = arr[2] -arr[1]
}
fori:=0; i < n-1; i++ {
ifarr[i+1]-arr[i] !=d {
returnarr[i] +d }
}
return-1}
1
2
3
4
5
6
7
8
9
10
classSolution {
publicintmissingNumber(int[] arr) {
int n = arr.length;
int d = Math.min(arr[1]- arr[0], arr[2]- arr[1]);
for (int i = 0; i < n - 1; i++) {
if (arr[i+1]- arr[i]!= d) return arr[i]+ d;
}
return-1;
}
}
1
2
3
4
5
6
7
8
9
10
classSolution {
funmissingNumber(arr: IntArray): Int {
val n = arr.size
val d = minOf(arr[1] - arr[0], arr[2] - arr[1])
for (i in0 until n - 1) {
if (arr[i+1] - arr[i] != d) return arr[i] + d
}
return -1 }
}
1
2
3
4
5
6
7
8
9
from typing import List
classSolution:
defmissingNumber(self, arr: List[int]) -> int:
n = len(arr)
d = min(arr[1] - arr[0], arr[2] - arr[1])
for i in range(n -1):
if arr[i+1] - arr[i] != d:
return arr[i] + d
return-1
1
2
3
4
5
6
7
8
9
10
11
12
impl Solution {
pubfnmissing_number(arr: Vec<i32>) -> i32 {
let n = arr.len();
let d = (arr[1] - arr[0]).min(arr[2] - arr[1]);
for i in0..n-1 {
if arr[i+1] - arr[i] != d {
return arr[i] + d;
}
}
-1 }
}