class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
vector<int> dp(nums.size() + 1, 0);
nums.insert(nums.begin(), INT_MIN);
int m=0;
for (int i = 1; i < nums.size(); i++){
for (int j = i - 1; j >= 0; j--){
if (nums[j] < nums[i]){
dp[i] = max(dp[i], dp[j] + 1);
}
}
if (dp[i] > m) m = dp[i];
}
return m;
}
};
这题的思想就是在dp数组中存储以当前元素为结尾的最长递增数组的长度,在访问新的元素时,遍历已经计算过的元素,寻找小于当前元素的数据,在所有匹配的元素中,选择对应dp最大的元素的长度+1。
class Solution {
public:
int findLengthOfLCIS(vector<int>& nums) {
vector<int> dp(nums.size(), 1);
int m = 1;
for (int i = 1; i < nums.size(); i++){
if (nums[i] > nums[i - 1]){
dp[i] = dp[i - 1] + 1;
m = max(m, dp[i]);
}
}
return m;
}
};
这题就比较简单,只要看前一位数字是否小于当前数字即可。
class Solution {
public:
int findLength(vector<int>& nums1, vector<int>& nums2) {
vector<vector<int>> dp(nums2.size(), vector<int>(nums1.size(), 0));
int m = 0;
for (int i = 0; i < nums1.size(); i++){
for (int j = 0; j < nums2.size(); j++){
if (nums1[i] == nums2[j]){
if (i == 0 || j == 0){
dp[j][i] = 1;
}else{
dp[j][i] = dp[j - 1][i - 1] + 1;
}
if (dp[j][i] > m) m = dp[j][i];
}
}
}
return m;
}
};
这题按照随想录的解法还是比较好理解的,根据两个数组的尺寸构建相应大小的二维数组,就可以用来表示两个数组中元素的对应关系,根据两个元素的索引,可以找到在二维数组中对应的位置,并根据两个元素是否相等,在二维数组中对应的位置填入相应的结果。二维数组中,根据坐上位置的结果,可以知道两个数组各自上一位数字是否一样,以及已经有几位数组重合,就可以计算当前位置两个数字是否相同,若相同,又究竟时第几位相同的数字。
1 | 2 | 3 | 4 | 5 | 6 | |
1 | 1 | 0 | 0 | 0 | 0 | 0 |
2 | 0 | 2 | 0 | 0 | 0 | 0 |
3 | 0 | 0 | 3 | 0 | 0 | 0 |
3 | 0 | 0 | 1 | 0 | 0 | 0 |
2 | 0 | 1 | 0 | 0 | 0 | 0 |
1 | 1 | 0 | 0 | 0 | 0 | 0 |