腾讯技术研究类和数据分析笔试(2019.8.17)第一道编程题AC

题目描绘:小Q是一名勤劳的园林工,他想修缮一下园林里的栅栏,栅栏由n根栏杆组成,第i根栏杆的长度为hi,小Q的修缮工作首先需要先连续拔除k根栏杆,小Q想知道如果连续拔k根栏杆,拔掉的最小长度总和是多少?
第一行两个数n和k,1<=n<=150000,1<=k<=n,第二行n个数。

这实际上找连续的和为最小的序列,python代码如下

n, k = list(map(int, input().split()))
h = list(map(int, input().split()))
idxMinimum = 1
if n == k:
    pass
else:
    cha = [h[k] - h[0]]
    for i in range(2, n-k+1):
        cha.append(h[i+k-1] - h[i-1] + cha[-1])

    idxMinimum = cha.index(min(cha)) + 2

print(idxMinimum)

解析:一开始我想的是只要循环n-k+1次,每次都把k个数加起来,然后求和最小的那一组,但是这样的话其实有很多重复的计算,比如说看下图这样:[0, k-1]这个区间和向右移动一位的[1, k]这个区间其实只是相差k和0的差值,我们只需要知道计算h[k]-h[0]就可以知道哪个区间的大了。

腾讯技术研究类和数据分析笔试(2019.8.17)第一道编程题AC_第1张图片

基于这种思想,我们只要建立一个差值列表cha,列表中的每个值都是该序列和第一个序列的差值,第一个值cha[0] = h[k] - h[0],也就是第二个序列和第一个序列的差值,那我们继续也就是从h[2]开始向后循环,首先计算h[i+k-1] - h[i-1] = h[k+1] - h[1],也就是第三个和第二个序列的差值,但是这还不够,我们要得到的是当前序列和第一个序列的差值,那我们现在知道了3和2的差值,2和1的差值,想算3和1的差值,cha[1] = h[k+1] - h[1] - cha[0]。以此类推,cha[2] = h[k+2] - h[2] - cha[1]。循环结束后我们只要计算一下差值列表的最小值就知道哪个序列和最小了。

你可能感兴趣的:(Code,算法工程师笔试机构)