LeetCode學習筆記

2022-08-11 12:15:17 字數 2931 閱讀 5661

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):

return li[n]

#三。時間複雜度n

def fib3(n):

a=1b=1

c=1for i in range(2,n+1):

c=a+b

a=bb=c

return c

print(fib1(33))

#時間裝飾器

import time

def cal_time(func):

t1=time.time()

result=func(*args,**kwargs)

t2=time.time()

print("%s running time:%s secs."%(func.__name__,t2-t1))

return result

#遞迴,漢諾塔

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]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]

leetcode學習筆記38

for example,given n 3,a solution set is 這道題是借鑑網上的思路解出的,主要摘自 所謂backtracking都是這樣的思路 在當前局面下,你有若干種選擇。那麼嘗試每一種選擇。如果已經發現某種選擇肯定不行 因為違反了某些限定條件 就返回 如果某種選擇試到最後發現...

Nemo的LeetCode學習筆記(3)

題目 給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。輸入 pwwkew 輸出 3 解釋 因為無重複字...

Leetcode周賽 198學習筆記

leetcode官方題解 1518 1 模擬 先把所有的酒喝完,得到n個空酒瓶。隨後,每次可以拿e個空酒瓶換1瓶新酒,將這1瓶新酒喝完,與剩下的e 1個酒瓶,去換新酒 res numbottles emptybottles numbottles while emptybottles exchange...