变态跳台阶[剑指offer]之python实现

时间:2021-09-05 16:04:42

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

题目链接

# -*- coding:utf-8 -*-
class Solution:
def jumpFloorII(self, number):
# write code here
ans=[];
ans.append(0);
ans.append(1);
ans.append(2);
for i in range(3 , number+1):
sum=1;
for j in range(1,i):
sum+=ans[j];
ans.append(sum);
return ans[number];

跳楼梯的方式有多种供选择,考虑写一层循环,找到所有的方法;

python中append的效率比 insert的效率要高:

Python中的列表则与此不同。它不是由若干个独立的节点相互引用而组成的,而是一整块单一连续的内存区块–我们通常称之为数组。这直接导致其与链表之间的一些区别。例如,尽管两者在遍历时的效率相差无几(除了链表有一些额外开销),但是如果我们按照既定索引值对某元素进行直接访问的话,显然使用数组会更加的高效。因为在数组中,我们通常可以直接计算出目标元素在内存中的位置,并对其进行直接访问。而对于链表,我们需要从头开始遍历整个链表。
但是对于insert操作来说,情况又有所不同。对于链表而言,只要知道了在哪里执行insert操作,其操作成本是非常低的。无论该链表中有多少元素,其操作时间大致相同。但是,对于数组而言,每次执行insert操作都需要移动插入点右边所有的元素,甚至在必要时需要把所有数组元素复制到另外一个更大的数组中。也正因如此,append操作通常会采用一种被称为动态数组或向量的特定解决方案。其主要思路是将内存分配的过大一些,并且等到其溢出时,在线性时间内再次重新分配内存。但这样做似乎会使得append操作变得跟insert操作一样糟糕。其实不然,因为尽管这两种情况会迫使我们去搬动大量的元素,但主要的不同点在于,对于append操作,发生这样的可能性要小得多。事实上,只要我们能确保每次所搬入的数组都大过原数组一定的比例(例如20%甚至100%),那么该操作的平均成本(或者说的更确切一些,将这些搬运开销均摊到每次append操作中去)通常是常数的。