程式設計題思路2

2021-09-24 13:10:28 字數 3132 閱讀 1960

1遞迴+記憶化 ->遞推

2狀態的定義  opt[n] dp[n]  fib[n]

3狀態轉移方程  opt[n] = best_of(opt[n-1],opt[n-2],.....)

4最優子結構  

比如斐波那契數列  n^2時間複雜度

int fib(int n)

現在加入記憶化,增加快取

f[0]=0,f[1]=1;

for (int i=0;i<=n;++i)

下面一道路徑判斷題

最後起點到終點,遞推  10+17=27種

時間複雜度 o(m*n)

狀態方程

opt[i,j]=opt[i-1,j]+opt[i,j-1]

if  a[i,j]= "空地":

opt[i,j]=opt[i-1,j]+opt[i,j-1]

else: //石頭

opt[i,j]=0

dp 回溯  貪心的區別

回溯(遞迴)  重複計算

貪心 永遠區域性最後

dp(動態規劃,遞推) 記錄區域性最優子結構/多種記錄值

習題:1爬樓梯,n層一共幾種辦法

public int climb(int n)

int mem=new int[n];

mem[0]=1;

mem[1]=2;

for(int i =2;ipython

def climb(self,n):

x,y=1,1

for _ in range(1,n):

x,y=y,x+y

return y

2 三角型最小路徑和

}零錢兌換

比如面值[1,2,5]  拼成11  

貪心:每次選滿最大面值

dp:看成上台階,每次最少的步數

int coinchange(vector& coins, int amount)

return dp[amount]>amount ? -1:dp[amount];

}

編輯距離

兩個單詞,單詞1變為單詞2,最少需要多少操作

horse -> ros  只用插入刪除替換

1暴力法 bfs廣度優先

2dp  兩部曲   

a 狀態  dp[i][j]

i表示單詞1  前i個字元,j表示單詞2前j個字元

單詞1 前i個字元 它匹配單詞2前j個字元

結果dp[m][n] 變動次數

bdp方程

dp[i][j]=

for  i 0->m

for  j  0->n

if w1[i]==w2[j]

dp[i][j]=dp[i-1][j-1]

else: // 插 刪 替

dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1

def mindistance(self,word1,word2):

m,n=len(word1),len(word2)

dp=[[o for _ in range(n+1)] for _ in range(m+1)]

for i in range(m+1):dp[i][0]=i

for j in range(m+1):dp[0][j]=j

for i in range(1,m+1):

for j in range(1,n+1):

dp[i][j]=min(dp[i-1][j-1] + (0 if word1[i-1] == word2[j-1] else 1),

dp[i-1][j]+1,

dp[i][j-1]+1)

return dp[m][n]

find 確定元素屬於哪乙個子集

union 將兩個子集合並成同乙個集合

經常解決的問題

1 小弟-》老大

2幫派識別

3兩種優化方法  合併&路徑壓縮

島嶼個數  

朋友圈記憶

錢包-儲存櫃

**模組

class lru(object):

def __init__(self,capacity):

self.dic=collections.ordereddict()

self.remain=capacity

def get(self,key):

if key not in self.dic:

return -1

v=self.dic.pop(key)

self.dic[key]=v

return v

def put(self,key,value):

if key in self.dic:

self.dic.pop(key)

else:

if self.remain >0:

self.remain -=1

else:

self.dic.popitem(last=false)

self.dic[key]=value

演算法題思路

鍊錶反轉 思路雙鏈表頭插法 利用棧查詢陣列不重複的值 思路利用異或運算 相同數值為0 任何職異或0為他本身的特性 計算質數 思路首先依次判斷2 n的各個數是否是質數 在暴力解法上優化,判斷乙個數是否是質數 只需要不能整除2到根號n之間的數就不是質數 2 n n大於1的數可以直接跳過肯定不是質數 使用...

FCC程式設計題筆記(2)

check for palindromes 檢查回文字串 如果給定的字串是回文,返回true,反之,返回false。如果乙個字串忽略標點符號 大小寫和空格,正著讀和反著讀一模一樣,那麼這個字串就是palindrome 回文 注意你需要去掉字串多餘的標點符號和空格,然後把字串轉化成小寫來驗證此字串是否...

javascript程式設計思路

程式是什麼?生活中的程式 宿舍保修 銀行開戶 解決生活中問題的步驟 流程 描述 自然語言 執行速度慢 計算機中的程式 解決問題的步驟描述,但是用的是計算機語言描述 計算機語言 執行速度快 什麼是程式設計 根據業務需要,制定或者編制解決問題的流程,編制程式的人應該是非常熟悉或者精通業務 編制電腦程式的...