zoukankan      html  css  js  c++  java
  • LeetCode学习笔记

    1.递归

    #1.斐波那契(1,1,2,3,5,8,...前两项之和是后一项),递归问题(调用自身,结束条件)
    
    
    #一 。时间复杂度2**n,即n+1,时间复杂度翻一倍
    def fibnacci(n):
        if n==0 or n==1:
            return 1 #结束条件
        else:
            return fibnacci(n-1)+fibnacci(n-2)#前两项和,调用自身
    @cal_time#递归函数不能直接用装饰器
    def fib1(n):
        return fibnacci(n)
    
    #二。时间复杂度n,空间复杂度n,
    @cal_time
    def fib2(n):
        li=[1,1]
        for i in range(2,n+1):
            li.append(li[-1]+li[-2])
        return li[n]
    
    #三。时间复杂度n
    def fib3(n):
        a=1
        b=1
        c=1
        for i in range(2,n+1):
            c=a+b
            a=b
            b=c
        return c
    
    
    print(fib1(33))
    
    #时间装饰器
    import time
    def cal_time(func):
        def wrapper(*args,**kwargs):
            t1=time.time()
            result=func(*args,**kwargs)
            t2=time.time()
            print("%s running time:%s secs."%(func.__name__,t2-t1))
            return result
        return wrapper
    #递归,汉诺塔
    def hanoi(n,A,B,C):
        if n>0:
            hanoi(n-1,A,C,B)
            print('%s->%s'%(A,C))
            hanoi(n-1,B,A,C)
    hanoi(3,'A','B','C')
    

    2.列表查找(2种)  

    #列表查找(2种):顺序查找O(n),二分查找O(logn)
    li=[1,2,5,67,2,6,7]
    6 in li#True
    li.index(6)#6的索引是5
    #线性查找,O(n)
    def line_search(num,li):
        count=0
        for i in li:
            if i==num:
                return count
            else:
                count+=1
        return -1
    print(line_search(67,li))
    #二分查找O(logn),有序列表才可以二分查找
    def bin_search(li,val):
        low=0
        high=len(li)-1
        while low<=high:
            mid=(low+high)//2
            if li[mid]==val:
                return mid
            elif li[mid]<val:
                low=mid+1
            else:
                high=mid-1
        return -1
    print(bin_search([1,2,3,4,5,6,7,8,9],4))
    #二分查找的递归调用
    def bin_search_rec(data_set,value,low,high):
        if low<=high:
            mid=(low_high)//2
            if data_set[mid]==value:
                return mid
            elif data_set[mid]>value:
                bin_search_rec[data_set,value,low,mid-1]
            else:
                bin_search_rec[data_set,value,low+1,high]
        else:
            return -1
    

     动态规划

    #动态规划
    #递归
    arr=[1,2,4,1,7,8,3]
    def rec_opt(arr,i):
        if i==0:
            return arr[0]
        elif i==1:
            return max(arr[0],arr[1])
        else:
            A=rec_opt(arr,i-2)+arr[i]
            B=rec_opt(arr,i-1)
            return max(A,B)
    #列表保存
    def dp_opt(arr):
        opt=np.zeros(len(arr))
        opt[0]=arr[0]
        opt[1]=max(arr[0],arr[1])
        for i in rang(2,len(arr)):
            A=opt[i-2]+arr[i]
            B=opt[i-1]
            opt[i]=max(A,B)
        return opt(len(arr)-1)
    
    
    arr=[3,34,4,12,5,2]
    def rec_subset(arr,i,s):
        if s==0:
            return True
        elif i==0:
            return arr[0]==s
        elif arr[i]>s:
            return rec_subset(arr,i-1,s)
        else:
            A=rec_subset(arr,i-1,s-arr[i])
            B=rec_subset(arr,i-1,s)
            return A or B
    def dp_subset(arr,S):
        subset=np.zeros((len(arr),S+1),dtype=bool)
        subset[:,0]=True
        subset[0,:]=False
        subset[0,arr[0]]=True
        for i in rang(1,len(arr)):
            for s in range(1,S+1):
                if arr[i]>s:
                    subset[i,s]=subset[i-1,s]
                else:
                    A=subset[i-1,s-arr[i]]
                    B=subset[i-1,s]
                    subset[i,s]=A or B
        r,c=subset.shape
        return subset[r-1,c-1]
    

      

     

  • 相关阅读:
    Java接口(interface),扫盲贴
    Java抽象类,扫盲贴
    Java类的继承、super关键字、复写
    Java内部类,扫盲贴
    数据结构学习笔记1--简单排序
    7.1 通用的职责分配软件原则 GRASP原则一: 创建者 Creator
    6.6 面向对象设计
    6.5 开始进入设计 … Transition to Design
    6.4 操作契约 Operation Contracts
    6.3 契约式设计
  • 原文地址:https://www.cnblogs.com/Turing-dz/p/13255993.html
Copyright © 2011-2022 走看看