LeetCode演算法打卡 動態規劃

2021-09-26 14:00:33 字數 2959 閱讀 8878

62. 不同路徑

乙個機械人位於乙個 m x n 網格的左上角 (起始點在下圖中標記為「start」 )。

機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角(在下圖中標記為「finish」)。

問總共有多少條不同的路徑?

/*

基本思想:基本動態規劃思想

*/class solution

void split(string s,vector&cur, vector> &result)}}

vector> partition(string s) };

115. 不同的子串行

給定乙個字串 s 和乙個字串 t,計算在 s 的子串行中 t 出現的個數。

乙個字串的乙個子串行是指,通過刪除一些(也可以不刪除)字元且不干擾剩餘字元相對位置所組成的新字串。(例如,"ace" 是 "abcde" 的乙個子串行,而 "aec" 不是)

/*我們需要乙個二維陣列dp(i)(j)來記錄長度為i的字串在長度為j的母串**現的次數,這裡長度都是從頭算起的,而且遍歷時,保持子串長度相同,先遞增母串長度,母串最長時再增加一點子串長度重頭開始計算母串。

首先我們先要初始化矩陣,當子串長度為0時,所有次數都是1,

當母串長度為0時,所有次數都是0.當母串子串都是0長度時,次數是1(因為都是空,相等)。

接著,如果子串的最後乙個字母和母串的最後乙個字母不同,說明新加的母串字母沒有產生新的可能性,可以沿用該子串在較短母串的出現次數,所以dp(i)(j) = dp(i)(j-1)

如果子串的最後乙個字母和母串的最後乙個字母相同,說明新加的母串字母帶來了新的可能性,我們不僅算上dp(i)(j-1),也要算上新的可能性。

那麼如何計算新的可能性呢,其實就是在既沒有最後這個母串字母也沒有最後這個子串字母時,子串出現的次數,我們相當於為所有這些可能性都新增乙個新的可能。

所以,這時dp(i)(j) = dp(i)(j-1) + dp(i-1)(j-1)

*/class solution

else

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

return dp[n][m];

}};

64. 最小路徑和

給定乙個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。

說明:每次只能向下或者向右移動一步。

/* dp[m][n]的值應該是dp[m-1][n]下移或dp[m][n-1]右移得到的,所以相當於找那兩個值最小的加上本來grid[m][n]

的值即可

*/class solution

else

dp[i][j]=0;

}else

else

dp[i][j]=0;

}if(dp[i][j]==1 && j-i+1> maxlen)}}

return s.substr(maxstart,maxlen);

}};

343. 整數拆分

給定乙個正整數 n,將其拆分為至少兩個正整數的和,並使這些整數的乘積最大化。 返回你可以獲得的最大乘積。

/*基本思路:動態規劃遞推式 dp記錄每乙個數當前拆分的最大值,當前數的拆分會依據前面的數

dp[i] = max(dp[i],max(j*(i-j),j*dp[i-j])) (j從1到1/2)

或者dp[i] = max(dp[i],dp[j]*dp[i-j]) (其中2,3特殊處理,唯二的dp[x]小於x的情況,其他都是dp[x]>=x)

*/class solution

// cout<357. 計算各個位數不同的數字個數

給定乙個非負整數 n,計算各位數字都不同的數字 x 的個數,其中 0 ≤ x < 10n 。

/*基本思想: 數學思想,對於dp就是每個n的沒有重複位數的數字,初始化0為1,1為10個數

對於 dp[i]= dp[i-1] + (dp[i-1]-dp[i-2])*(10-(i-1))

dp[i-1]沒什麼可說的,加上之前的數字

(dp[i-1]-dp[i-2])*(10-(i-1)) 假如n=3 就在n=2的基礎上(注意dp[2]包含了只有一位的數,所以減去dp[1])新增一位數組成數字,但是新增的數字只能是之前2位數中沒有的(10-(i-1)),

*/class solution

return dp[n];

}};

53. 最大子序和

給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列(子陣列最少包含乙個元素),返回其最大和。

/*基本思想:當前和<0 ,就斷開不繼續累加,否則繼續累加 注意每次都要更新最大值結果

*/class solution

int rightsum =0;

for(int i=mid+1;i<=right;i++)

return max(max(l,r),leftmaxsum+rightmaxsum);

}int maxsubarray(vector& nums)

};

152. 乘積最大子陣列

給你乙個整數陣列nums,請你找出陣列中乘積最大的連續子陣列(該子陣列中至少包含乙個數字)。

所以要得到乘以當前元素以後的最大乘積,需要記錄最大乘積,也要記錄最小乘積,因為最小值可能翻身變最大值。對於當前元素是負的情況就需要乘之前的最小值比較

*/class solution {

public:

int maxproduct(vector& nums) {

int max_value = int_min;

int cur_max = 1;

int cur_min = 1;

for(int i=0;i

LeetCode演算法打卡

475.供暖器 冬季已經來臨。你的任務是設計乙個有固定加熱半徑的供暖器向所有房屋供暖。現在,給出位於一條水平線上的房屋和供暖器的位置,找到可以覆蓋所有房屋的最小加熱半徑。所以,你的輸入將會是房屋和供暖器的位置。你將輸出供暖器的最小加熱半徑。說明 給出的房屋和供暖器的數目是非負數且不會超過 25000...

LeetCode演算法打卡 區間問題

57.插入區間 給出乙個無重疊的 按照區間起始端點排序的區間列表。在列表中插入乙個新的區間,你需要確保列表中的區間仍然有序且不重疊 如果有必要的話,可以合併區間 基本思想 先找到要插入的區間的位置,拆入之後,區間合併 如果插入式頭,那就從後面判斷合併的區間,找後面的start大於插入區間end的位置...

LeetCode演算法打卡 字串

28.實現 strstr 實現 strstr 函式。給定乙個 haystack 字串和乙個 needle 字串,在 haystack 字串中找出 needle 字串出現的第乙個位置 從0開始 如果不存在,則返回 1。基本思想 最簡單的就是對於needle來遍歷haystack i指向haystack...