猿问

基础算法求助(已解决)

一个看起来较为基础的计算机算法问题,求大神解惑!
(已解决,末尾给出参考答案)
参数
给定一组长度为length的随机正整数列表list,list中元素均小于或等于max;(注:length>2)
给定正整数参数midshort、long,且满足0
条件
从list中选取包括首尾元素在内的若干个元素组成一个新的列表list_cut,list_cut需要满足以下几个条件:
list_cut中各个元素均需小于mid;
list_cut中各个元素间在list中的索引值差为gap,且满足0若给定的参数无法选出list_cut,返回False;
若给定的参数可以选出多个list_cut,则返回所有list_cut中元素平均值最低的一个。
示例一
#输入
list=[4,7,3,5,8,6,2,3,1,2]
mid=5
short,long=2,4
#输出
list_cut=[4,3,2,2]
示例二
#输入
list=[4,7,6,5,8,6,2,3,1,2]
mid=5
short,long=2,4
#输出
list_cut=False
参考答案
多谢@SegmentWarrior大佬提供的思路与C++代码;下面给出我“翻译”并稍加改进后的python版的答案。
deffind_list(nums:list,s:int,l:int,mid:int):
"""
nums:目标数组
s:short最短长度
l:long最长长度
mid:限制大小
"""
#dp到当前位置的上一个最优解的index
n=len(nums)
dp=[-1]*n
dp[0]=0
foriinrange(n-s):
forjinrange(i+s,min(i+l+1,n)):
ifnums[j]>=mid:
continue
elifdp[i]!=-1:
dp[j]=i
ifdp[-1]==-1:
returnFalse
res=[]
inx=n-1
whileinx>0:
res.append(nums[inx])
inx=dp[inx]
res.append(nums[0])
returnres[::-1]
森栏
浏览 496回答 2
2回答
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答