计算最接近的数 python版

一、题目描述

给定一个数组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

四、额外补充

题目中所要求的输入是直接输入列表,但是我代码里不是,我不太清楚如何直接输入列表的。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值