Esta pregunta no se entendió al principio, así que reitere los requisitos de la pregunta:
Dada una lista nums, saltamos hacia atrás desde el elemento 0,
la distancia más larga a la que podemos saltar al principio es nums [0],
es decir, podemos elegir saltar a
{1,2, ... en el primer paso , nums [0]},
luego, suponiendo que saltamos a a, podemos continuar saltando. El
rango de salto opcional es {a + 1, ..., a + nums [a]}
Salta así hasta que saltemos al final ,
Si esto puede saltar hasta el final, devolvemos verdadero, de lo contrario devuelve falso
Ordene la idea: esto se puede resolver con un algoritmo codicioso.
Esperamos saltar al lugar más alejado después de cada salto.
Por lo tanto, primero calculamos la posición más lejana
que se puede saltar desde cada posición porque cada uno de los números El significado de los elementos es la distancia más lejana
que se puede saltar desde aquí, y la posición más lejana que se puede alcanzar desde nums [i] se puede expresar como i + nums [i].
Por lo tanto, primero calculamos
nums = para cada elemento de nums = [i + nums [i] para i, valor en enumerate (nums)]
Ahora el significado del elemento i-th en nums es que si saltamos desde la posición i-th,
podemos saltar a la posición más lejana.
Nuestra estrategia de salto es
Comenzando desde nums [0], salte a la posición más lejana que se pueda
alcanzar cada vez. Por ejemplo, para nums = [3,2,1,0,4], después del cálculo, nums = [3,3,3,3,8]
entonces podemos saltar desde la primera posición a 0, 2, 3
hemos elegido nums [1: 4] Ese nums [1], nums [2 ], nums [3] el mayor
ha sido tan salto hasta el último
Salte a la última posición: Verdadero
o atascado en una posición (es decir, la posición tempmax que se puede alcanzar aún no ha llegado al final y este valor permanece sin cambios después de dos saltos consecutivos): Falso
class Solution:
def canJump(self, nums: List[int]) -> bool:
length = len(nums)
nums = [nums[i] + i for i in range(length)]
start = 0
last = 0
this = 0
while this < length - 1:#还没到
if start == 1 and this == last:
return False
elif start == 0:
start = 1
end = nums[this]
if end >= length - 1:
return True
templist = nums[last:end+1]#last+1
tempmax = max(templist)
last = this
this = tempmax
print(last,this)
if this == end and this < length - 1:
return False
return True