常见算法简介及python代码
1.冒泡排序
def bubblesort(nums): for i in range(len(nums)-1): for j in range(len(nums)-i-1):if nums[j]>nums[j+1]: nums[j],nums[j+1] =nums[j+1],nums[j] return nums nums = [23,43,54,12,44,56,65] re = bubblesort(nums) print(re)
简单解析: 从list首端逐个对数据进行两两比较,大的往后放,外层循环一次,会在list尾端得到一个最大值,类似于冒泡行为,每次循环的最大值都固定不动,循环到最后就会出现一组从小到大的数据。
2.爬楼梯问题
基本问题:对于n阶台阶,每次只能爬1阶或者2阶,问一共有多少种爬法?
def climb(n): cclimb = [0,1,2] for i in range(3,n+1): cclimb.append(cclimb[i-1]+cclimb[i-2]) print(cclimb) return cclimb[n] re = climb(100) print(re)
简单解析:可以以动态规划思想来入手,抽出子问题:n阶只可能是由n-1和n-2阶两种方式爬上来,所以把n-1和n-2的爬法相加即为n的爬法,边界条件:0阶为0,1阶为1,2阶为2;
类似于斐波那契数列,可以用递归来求解,但这样会有很多重复计算,而动态规划会以空间换取时间的思想将每一步都记录下来,进而求解。
递归可以试试,相当慢!
斐波那契数列:[0,1,1,2,3,5,8,13,21.......]
# 递归 def f(n): if n<1: return 0 if n<3: return 1 return f(n-1)+f(n-2) print(f(100))
3.钱币找零
基本问题:有各面值钱币数个,不定,可能为0,支付某定额商品,求所支付钱币个数最少是多少
def money(): count = [3,0,2,1,0,3,5] value = [1,2,5,10,20,50,100] value.sort(reverse=True) count =count[::-1] money = 223 re =0 for i in value: num = min(money//i,count[value.index(i)]) money-=num*i re+=num if money >0: return -1 return re print(money())
简单解析:在保证张数足够的情况下以最大面额逐个凑齐money