1 动态规划
注意:dp
数组的定义一定要正确,否则难以定义正确的状态转移方程
【本题dp
数组定义】:dp[i]
表示前i
个元素中最长递增子序列长度(必须包含第i
个尾元素, 否则无法确定状态如何转移)
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int size = nums.size();
// dp[i]表示前i个元素中最长递增子序列长度(必须包含第i个尾元素, 否则无法确定状态如何转移)
vector<int> dp(size, 1);
int len = 0;
// 状态
for (int cur = 0; cur < size; cur++) {
// 选择:从前i-1个dp中选择最大且尾部元素<当前元素的dp进行状态转移
for (int pre = 0; pre < cur; pre++)
if (nums[pre] < nums[cur])
dp[cur] = max(dp[cur], dp[pre] + 1);
len = max(len, dp[cur]);
}
return len;
}
};
2 二分搜索(来源于纸牌游戏)
待二刷时再来更新~
致谢
图片来源于「代码随想录」公众号,欢迎大家关注这位大佬的公号