算法_正整数数组的最优跳动方式_python

题目:获取一个正整数数组的最优跳动方式,要求如下:
1)从数组中间的任意位置开始向右跳,每次跳动的步伐数不能超过该位置对应元素的值
2)在跳动次数最少的情况下计算每次跳动的步伐

#定义一个树节点,普通的树
class ptree():
    def __init__(self,index,lst = []):
        self.index = index #树的节点值 ,此处为列表的元素的下标

        #孩子列表,ptree对象列表,列表对象一定要深度拷贝
        self.child_lst = copy.deepcopy(lst)

import copy
#为nodei节点  添加孩子,nodei代表节点在列表中的小标位置,为其添加孩子列表
def addchildfornodei(nodei,lst):
    
    length = len(lst)

    #如果从此节点直接 跳到最右测,那么它的孩子只有一个:lst的最后一个元素
    if  length - 1 -nodei.index <=lst[nodei.index]:
        child = ptree(length - 1)
        nodei.child_lst.append(child)
        return  

    #否则,一次跳不完,那么根据其值,添加所有可能的孩子
    else:

        for cc in range(1,lst[nodei.index]+1):
                     
            child = ptree(nodei.index+cc)
            nodei.child_lst.append(child)
            
            #循环嵌套,为孩子节点,再次添加孩子
            addchildfornodei(nodei.child_lst[len(nodei.child_lst)-1],lst)

        return  
        

        
#创建一个树,普通的树,从当前元素,所有可能的路,到达终点                
def creattree(lst,i):
    

    length = len(lst)

    if length >3 and 0< i < length -1:
        pass
    else:
        return None

    #生成跟节点,为其增加孩子节点
    root = ptree(i)

    addchildfornodei(root,lst)

    return root 

import copy

#
def  addlst(node,lst_path):
    
    if len(node.child_lst) ==0:
        return

    j_path_pos = 0###
    #循环获得,当前跟节点,所在的路径,以便继续完善
    for i in range(len(lst_path)):
        if node.index == lst_path[i][len(lst_path[i])-1]:
            j_path_pos = i
            break

    #保存当前路径副本,并从元列表中删除
    j_path = lst_path.pop(j_path_pos)

    #循环将孩子节点加入路径中
    for i in range(len(node.child_lst)):
        tmp_path = copy.deepcopy( j_path)
        tmp_path.append(node.child_lst[i].index)
        lst_path.append(tmp_path)
    #嵌套对每个孩子,仅需添加路径
    for i in range(len(node.child_lst)):    
        addlst(node.child_lst[i],lst_path)

        

#遍历树root,获得所有根到叶子的路径
def getlst(root):

    lst_result = [[root.index]]
    #嵌套循环,为当前节点获取路径
    addlst(root,lst_result)
    return  lst_result
 


def fuuu():
    lst = [2,3,4,1,5,2,6,1,7,3,4,1,5]


    root = creattree(lst,2)

    ll = getlst(root)
    #对所有路径排序,最短的为最快的
    sorted(ll,key = lambda x :len(x))
    short = len(ll[0])


    for i in ll:
        if short == len(i):
            print(i)

        else:
            break
    

fuuu()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值