寻找木头
样例1
输入
5
1 5 4 3 2
输出
2
样例2
输入:
8
2 1 3 4 S 6 8 7
输出:
4
题解:
一开始我的思路是
找到数组的最大值最小值距离两端的最小距离,如果都距离一端近,就输出两个最小距离的最大值(如样例1);
如果分别距离首尾近则输出两个最小距离的和(如样例2);
但如果是最大值最小值都很靠正中间,最大值最小值的之间距离小于最大值最小值距离两边的距离输出两个最小距离的最小值加上两个最大值最小值之间的距离。
想到这里的时候就不对劲了,换一个思路:
还是找数组的最大值最小值距离两端的最小距离,还是上面的判断条件,
但是需要解决上面分类复杂的问题,
如果最大值和最小值之间的距离很大,则是两边输出,如果最大值和最小值之间的距离(abs(maxidx - minidx))很小,那么适合单边距离的最大值。
那这个距离的阈值怎么找的呢?
首先如何判断最大值最小值之间的距离是大还是小:
如果最大值最小值之间的距离(abs(maxidx - minidx))大于最大值最小值距离两边的最小值,那么适合两边距离的和;
如果最大值最小值之间的距离(abs(maxidx - minidx))小于最大值最小值距离两边的最小值,那么适合单边距离的最大值;
到这里思路就明朗起来了。
代码如下:
N = int(input())
list = input().split(' ')
maxidx = list.index(max(list)) # 最大值索引
minidx = list.index(min(list)) # 最小值索引
len = abs(maxidx -minidx) - 1 #最小值和最大值中间的元素个数(左开右开)
if len < N/2:
out = min(max(maxidx, minidx) + 1, max(N-maxidx, N-minidx))
else:
out = N - len
print(out)
执行效果: