常见算法简介及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

 

posted @ 2021-05-31 14:39  纵横捭阖行  阅读(116)  评论(0编辑  收藏  举报