每日一题:牛牛构造等差数列

题意

有 $n$ 个数,他们对每个数可以进行 $+1$ 或 $-1$ 操作,但对于每一个数,该操作最多只能执行一次。使用最少的操作次数,将这几个数构造成一个等差数列。如果完全不能构造成功,就输出 $-1$。

Solution

每个数最多只能修改一次,因此我们只要枚举前两个数的修改状态就能确定首项和公差,只有 $9$ 种可能,然后逐一判断取最小值即可。

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class Solution {
public int solve(int n, int[] b) {
int res = Integer.MAX_VALUE;
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
b[0] += i;
b[1] += j;
int d = b[1] - b[0];
int pre = b[1], now, cnt = 0;
boolean flag = false;
if (i != 0)
cnt++;
if (j != 0)
cnt++;
for (int k = 2; k < n; k++) {
now = pre + d;
if (Math.abs(now - b[k]) > 1) {
flag = true;
} else if (Math.abs(now - b[k]) == 1) {
cnt++;
}
pre = now;
}
if (flag == false) {
res = Math.min(res, cnt);
}
b[0] -= i;
b[1] -= j;
}
}
return res == Integer.MAX_VALUE ? -1 : res;
}
}
作者

Benboby

发布于

2020-08-31

更新于

2021-01-28

许可协议

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×