解题思路
这是一道数组处理问题,主要思路如下:
-
问题分析:
- 给定一个递增序列
- 需要删除一个中间元素(不包括首尾)
- 求删除后序列的最大间隔的最小可能值
- 最大间隔定义为相邻元素的最大差值
-
解决方案:
- 遍历每个可以删除的位置
- 计算删除每个元素后的最大间隔
- 在所有可能的最大间隔中取最小值
- 注意处理边界情况
-
优化实现:
- 只需要考虑删除点及其相邻位置的间隔变化
- 其他位置的间隔不会受到影响
- 维护全局的最小值
代码
#include <iostream>
using namespace std;
const int MAXN = 101;
int arr[MAXN];
int main() {
int n;
while (cin >> n) {
// 读入数据
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
// 计算原始最大间隔
int maxGap = -1001;
for (int i = 0; i < n-1; i++) {
maxGap = max(maxGap, arr[i+1] - arr[i]);
}
// 尝试删除每个中间元素
int ans = 1001;
for (int i = 1; i < n-1; i++) {
// 计算删除i后的新间隔
int newGap = arr[i+1] - arr[i-1];
// 更新答案
int curMax = max(maxGap, newGap);
ans = min(ans, curMax);
}
cout << ans << endl;
}
return 0;
}
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
int[] arr = new int[n];
// 读入数据
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
// 计算原始最大间隔
int maxGap = -1001;
for (int i = 0; i < n-1; i++) {
maxGap = Math.max(maxGap, arr[i+1] - arr[i]);
}
// 尝试删除每个中间元素
int ans = 1001;
for (int i = 1; i < n-1; i++) {
// 计算删除i后的新间隔
int newGap = arr[i+1] - arr[i-1];
// 更新答案
int curMax = Math.max(maxGap, newGap);
ans = Math.min(ans, curMax);
}
System.out.println(ans);
}
sc.close();
}
}
def solve():
n = int(input())
arr = list(map(int, input().split()))
# 计算原始最大间隔
max_gap = max(arr[i+1] - arr[i] for i in range(n-1))
# 尝试删除每个中间元素
ans = float('inf')
for i in range(1, n-1):
# 计算删除i后的新间隔
new_gap = arr[i+1] - arr[i-1]
# 更新答案
cur_max = max(max_gap, new_gap)
ans = min(ans, cur_max)
return ans
def main():
while True:
try:
print(solve())
except EOFError:
break
if __name__ == "__main__":
main()
算法及复杂度
- 算法:遍历 + 贪心
- 时间复杂度: - 为序列长度
- 空间复杂度: - 只需要常数额外空间