一、题目描述
给定一个数组X和正整数K,请找出使表达式X[i]-x[i+1]…-X[i+k-1],结果最接近于数组中位数的下标i,如果有多个满足条件,请返回最大的i。
其中,数组中位数:长度为N的数组,按照元素的值大小升序排列后,下标为N/2元素的值
补充说明:
1.数组X的元素均为正整数;
2.X的长度n取值范围: 2<= n <= 1000;
3.K大于0且小于数组的大小;
4. i的取值范围:0<=i < 1000;
5.题目的排序数组X[N]的中位数是X[N/2].(我按照的是原中位数的概念求解的)
二、解题思路
首先,定义find_median()函数求中位数,之后定义find_best_index()函数寻找最大的i,最后定义main()函数用于输入和调用函数。
三、详细代码
def find_median(arr):
'''
求数字数组中位数
:param arr: 数字数组
:return: 返回中位数
'''
sorted_arr = sorted(arr)
arr_len = len(arr)
n = arr_len // 2 # 中位数的位置
if arr_len % 2 != 0:
median = sorted_arr[n]
else:
median = (sorted_arr[n] + sorted_arr[n - 1]) // 2
return median
def find_best_index(arr, K, median):
'''
找到数组中连续K个数组合差最小的起始位置索引
:param arr: 数字数组
:param K: 连续K个数
:param median: 中位数
:return: 组合差最小的连续K个数中起始位置的索引
'''
# 初始化最接近的差距为无穷大,和最好的开始位置
best_gap = float('inf')
best_index = -1
for i in range(len(arr) - K + 1):
# 使用滑动窗口的方式来计算子数组的数字组合
window_val = arr[i]
for j in range(1, K):
window_val -= arr[i + j]
# 比较差距,并更新最好的开始位置
gap = abs(window_val - median)
if gap < best_gap or (gap == best_gap and i > best_index):
best_gap = gap
best_index = i
return best_index
def main():
arr = list(map(int, input().split())) # 还差输入列表的方式
K = int(input())
median = find_median(arr)
best_index = find_best_index(arr, K, median)
print(best_index)
if __name__ == "__main__":
main()
运行结果
#输入
50 50 2 3
2
#输出
2
四、额外补充
题目中所要求的输入是直接输入列表,但是我代码里不是,我不太清楚如何直接输入列表的。