def canJump(nums): """ :type nums: List[int] :rtype: bool """ # # Each index value is the maximum you can jump from that position # maxJump = 0 # if len(nums) == 1: # return True # for x in range(len(nums)-1): # print(nums[x]) # maxJump += nums[x] # if nums[x] >= len(nums)-(x+1): # return True # # print(maxJump) # if nums[x] == 0: # if x-1 >= 0 and nums[x-1] >=2: # maxJump += nums[x] # else: # # print(x+1) # # print(len(nums)) # # if nums[x+1] >= len(nums)-(x+2) and x+1 != len(nums)-1: # # return True # return False # return False # Double pointer method start = 0 jump = len(nums)-2 # Case for single value array if len(nums) == 1 or nums[start] >= len(nums)-1: return True while start <= jump: print(f'start: {start}, value {nums[start]}') print(f'jump index: {jump}, value: {nums[jump]}') if nums[start] == 0: return False # check if jump is equal to end jump if not nums[jump] >= (len(nums)-(jump+1)): jump -= 1 if not nums[start + nums[start]] >= 0: if start + nums[start] >= jump: return True start += 1 else: start += 1 # print(canJump([2,3,1,1,4])) # print(canJump([3,2,1,0,4])) # print(canJump([3,0,8,2,0,0,1])) # print(canJump([2,0,2])) print(canJump([2,5,0,0])) # print(canJump([0,2,3])) # print(canJump([2,0,0])) # print(canJump([1,1,2,2,0,1,1])) # print(canJump([5,9,3,2,1,0,2,3,3,1,0,0]))