300.最长递增子序列
视频讲解:https://www.bilibili.com/video/BV1ng411J7xP
https://programmercarl.com/0300.%E6%9C%80%E9%95%BF%E4%B8%8A%E5%8D%87%E5%AD%90%E5%BA%8F%E5%88%97.html
思路
#define max(a, b) ((a) > (b) ? (a) : (b))
int lengthOfLIS(int* nums, int numsSize) {if(numsSize <= 1){return numsSize;}int dp[numsSize];for(int i = 0; i < numsSize; i++){dp[i]=1;}int result = 1;for (int i = 1; i < numsSize; ++i) {for (int j = 0; j < i; ++j) {if(nums[i] > nums[j]){dp[i] = max(dp[i], dp[j] + 1);}if(dp[i] > result){result = dp[i];}}}return result;
}
学习反思
用于求解给定数组的最长递增子序列的长度。其中,dp数组用于存储以每个元素为结尾的最长递增子序列的长度。代码的逻辑比较简单,首先对dp数组进行初始化,将每个元素的初始值设为1,表示每个元素自身就是一个子序列。然后,使用双重循环对每个元素进行遍历,比较当前元素与之前元素的大小关系。如果当前元素大于之前元素,说明可以将当前元素加入到递增子序列中,此时更新dp数组的值为之前元素对应的最长递增子序列的长度加1。同时,更新最终结果result的值为dp数组中的最大值。最后,返回result即为最长递增子序列的长度。这段代码的时间复杂度为O(n^2),空间复杂度为O(n)。
674. 最长连续递增序列
视频讲解:https://www.bilibili.com/video/BV1bD4y1778v
https://programmercarl.com/0674.%E6%9C%80%E9%95%BF%E8%BF%9E%E7%BB%AD%E9%80%92%E5%A2%9E%E5%BA%8F%E5%88%97.html
思路
int findLengthOfLCIS(int* nums, int numsSize) {if(numsSize == 0){return 0;}int dp[numsSize];for(int i = 0; i < numsSize; i++){dp[i] = 1;}int result = 1;for (int i = 1; i < numsSize; ++i) {if(nums[i] > nums[i - 1]){dp[i] = dp[i - 1] + 1;}if(dp[i] > result){result = dp[i];}}return result;
}
学习反思
用于求解给定数组的最长连续递增子序列的长度。其中,dp数组用于存储以每个元素为结尾的最长连续递增子序列的长度。代码的逻辑也比较简单,首先判断数组是否为空,如果为空则返回0。然后,对dp数组进行初始化,将每个元素的初始值设为1,表示每个元素自身就是一个连续递增子序列。接着使用单层循环遍历数组,比较当前元素与前一个元素的大小关系。如果当前元素大于前一个元素,说明可以将当前元素加入到连续递增子序列中,此时更新dp数组的值为前一个元素对应的最长连续递增子序列的长度加1。同时,更新最终结果result的值为dp数组中的最大值。最后,返回result即为最长连续递增子序列的长度。这段代码的时间复杂度为O(n),空间复杂度为O(n)。
718. 最长重复子数组
视频讲解:https://www.bilibili.com/video/BV178411H7hV
https://programmercarl.com/0718.%E6%9C%80%E9%95%BF%E9%87%8D%E5%A4%8D%E5%AD%90%E6%95%B0%E7%BB%84.html
思路
int findLength(int* nums1, int nums1Size, int* nums2, int nums2Size) {int dp[nums1Size + 1][nums2Size + 1];memset(dp, 0, sizeof(dp));int result = 0;for (int i = 1; i <= nums1Size; ++i) {for (int j = 1; j <= nums2Size; ++j) {if(nums1[i - 1] == nums2[j - 1]){dp[i][j] = dp[i - 1][j - 1] + 1;}if(dp[i][j] > result){result = dp[i][j];}}}return result;
}
学习反思
用于求解两个数组的最长公共子序列的长度。其中,dp数组用于存储两个数组的子问题的解,dp[i][j]表示nums1数组前i个元素和nums2数组前j个元素的最长公共子序列的长度。代码的逻辑也比较简单,首先初始化dp数组为0。然后使用双层循环遍历两个数组,如果当前元素相等,则将dp[i][j]更新为dp[i-1][j-1] + 1,即将当前元素加入到最长公共子序列中。同时,更新最终结果result的值为dp数组中的最大值。最后,返回result即为最长公共子序列的长度。这段代码的时间复杂度为O(mn),其中m为nums1数组的长度,n为nums2数组的长度。空间复杂度为O(mn)。
总结
加油!!!