算法训练day56leetcode300.最长递增子序列674最长连续递增序列
part13leetcode300.最长递增子序列674最长连续递增序列 718最长重复子数组
300. 最长递增子序列
本题最关键的是要想到dp[i]由哪些状态可以推出来,并取最大值,那么很自然就能想到递推公式:dp[i] = max(dp[i], dp[j] + 1);
#include <iostream>
#include <vector>
class Solution {
public:
int lengthOfLIS(std:: vector<int>& nums) {
std::vector<int> dp(nums.size(), 1);
int max = 1;
for (int i = 1; i < nums.size(); i++) {
for (int j = 0; j < i; j++) {
if (nums[i] > nums[j]) {
dp[i] = std::max(dp[i], dp[j] + 1);
}
}
max = std::max(max, dp[i]);
}
//打印dp数组
// for(int i: dp) {
// std::cout << i << ' ';
// }
return max;
}
};
int main() {
std::vector<int> nums = {10,9,2,5,3,7,101,18};
Solution sol;
int res = sol.lengthOfLIS(nums);
std::cout <<std::endl;
std::cout << "res:" << res << std::endl;
return 0;
}
674. 最长连续递增序列
因为本题要求连续递增子序列,所以就只要比较nums[i]与nums[i - 1],而不用去比较nums[j]与nums[i] (j是在0到i之间遍历)。
既然不用j了,那么也不用两层for循环,本题一层for循环就行,比较nums[i] 和 nums[i - 1]。
#include <iostream>
#include <vector>
class Solution {
public:
int findLengthOfLCIS(std::vector<int>& nums) {
std::vector<int> dp(nums.size(), 1);
int max = 1;
for (int i = 1; i < nums.size(); i ++) {
if(nums[i] > nums[i - 1]) {
dp[i] = dp[i - 1] + 1;
}
max = std::max(max, dp[i]);
}
//print dp
// for (int i : dp) {
// std::cout << i << ' ' ;
// }
return max;
}
};
int main() {
Solution sol;
std::vector<int> nums = {1, 2,3 ,5,2,4,6,8,7};
int res = sol.findLengthOfLCIS(nums);
std::cout << res << std::endl;
return 0;
}
原文地址:https://blog.csdn.net/qq_36372352/article/details/137273221
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!