leetcode 413 446 等差數列劃分

2021-10-21 04:11:11 字數 1382 閱讀 8561

思路:dp,這種可以劃分為子問題的題目都可以用dp來做;主要是思考的過程;

如[1,2,3,4,5]

(1)等差資料需要3個數字,故從3開始計算,需要判斷以3為結尾的組合數

(2)res需累計以各個位置為尾部的組合個數

(3)dp[i] = dp[i - 1] + 1,表示以dp[i]為尾部的組合個數,例如,5位置,為什麼是3呢(4位置的個數為1234、234共2個等差數列,而5的位置包含了4位置開始的2個等差數列 + 345這個等差數列)

int numberofarithmeticslices(vector& nums) 

int res = 0;

vectordp(nums.size(), 0);

for (int i = 2; i < nums.size(); i++)

//累加和

res += dp[i];

}return res;

}

優化dp vector

int numberofarithmeticslices(vector&nums) 

//用i_value和i_value_代替dpi]和dp[i-1]

int i_value = 0, i_value_ = 0;

int res = 0;

for (int i = 2; i < nums.size(); i++) else

res += i_value;

}return res;

}

leetcode 446 等差數列劃分ii

可降問題擴充套件到以i為尾部所得到的等差數列組合數,故還是使用dp進行操作;

因為沒有其他資訊使用,故只能迴圈進行遍歷,時間複雜度為o(n^2)

一維陣列只能儲存位置i和位置j之間的關係,無法儲存第三個數之間關係,故採用二位陣列;

dp[i][diff] 子問題:表示以i為尾部,等差值diff的弱等差數列個數(大於等於2個數值);dp[j][diff] 同樣是以j為開始i為結尾 等差值 diff 的弱等差數列個數; 因為等差數列是以3個數值為起點,故不能加dp[i][diff],這時加dp[j][diff]則可以保證是等差數列個數(因為:當diff = nums[i] - nums[j]已經存在dp[j][diff]中的話,說明之前已經有差值為diff的弱等差數列了,所以,只需要加這部分即可)

int numberofarithmeticslices(vector&nums) 

int res = 0;

vector> dp(nums.size());

for (int i = 0; i < nums.size(); i++)

}return res;

}

Leetcode動態規劃(2) 中等)

簡單記錄刷題的過程 大佬勿噴 一和零多維0 1揹包問題 把題目給定的 0 的數量看成乙個揹包,1的數量看成另乙個揹包,把陣列中的每乙個字串看成一件件商品,統計每乙個字串 0 和 1的數量,動態規劃填表 狀態轉移方程 dp i j max dp i j 1 dp i count0 j count1 其...

分割等和子集 leetcode416

給定乙個只包含正整數的非空陣列。是否可以將這個陣列分割成兩個子集,使得兩個子集的元素和相等。注意 每個陣列中的元素不會超過 100 陣列的大小不會超過 200 示例 1 輸入 1,5,11,5 輸出 true 解釋 陣列可以分割成 1,5,5 和 11 示例 2 輸入 1,2,3,5 輸出 fals...

LeetCode 127 中等 單詞接龍

給定兩個單詞 beginword 和 endword 和乙個字典,找到從 beginword 到 endword的最短轉換序列的長度。轉換需遵循如下規則 每次轉換只能改變乙個字母。轉換過程中的中間單詞必須是字典中的單詞。說明 示例 1 輸入 beginword hit endword cog wor...