江门网站建设哪家快,wordpress single page,安徽建设工程造价信息网,提供东莞网站建设价格LeetCode 300.最长递增子序列
题目链接#xff1a;力扣#xff08;LeetCode#xff09;官网 - 全球极客挚爱的技术成长平台
题目描述#xff1a;给你一个整数数组 nums #xff0c;找到其中最长严格递增子序列的长度。
子序列 是由数组派生而来的序列#xff0c;删除力扣LeetCode官网 - 全球极客挚爱的技术成长平台
题目描述给你一个整数数组 nums 找到其中最长严格递增子序列的长度。
子序列 是由数组派生而来的序列删除或不删除数组中的元素而不改变其余元素的顺序。例如[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
解题思路
通过两次循环在ji时判断nums[j]是否小于nums[i]如果是则子序列长度加一 确定dp数组dp table以及下标的含义
dp[i]代表从0到i递增子序列的长度
确定递推公式
if(nums[i] nums[j]) dp[i] max(dp[i],dp[j]1);
dp数组如何初始化
一个数就是长度为1的子序列所以全部初始化为1.
确定遍历顺序
从递归公式其实已经可以看出一定是从前向后遍历因为dp[i]依靠dp[i - 1]的数值。
举例推导dp数组
class Solution {
public:int lengthOfLIS(vectorint nums) {if(nums.size() 1) return 1;vectorint dp(nums.size(),1);int result 0;for(int i1;inums.size();i){for(int j0;ji;j){if(nums[i] nums[j]){dp[i] max(dp[i],dp[j]1);}result max(result,dp[i]);}}return result;}
};
总结
子序列要二重遍历。
LeetCode 674.最长连续递增序列
题目链接力扣LeetCode官网 - 全球极客挚爱的技术成长平台
题目描述给定一个未经排序的整数数组找到最长且 连续递增的子序列并返回该序列的长度。
连续递增的子序列 可以由两个下标 l 和 rl r确定如果对于每个 l i r都有 nums[i] nums[i 1] 那么子序列 [nums[l], nums[l 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。
解题思路
确定dp数组dp table以及下标的含义
dp[i]代表到nums[i]为止最长的连续递增子序列
确定递推公式
如果前一个前一个数小于后一个数也就是递增的我们就将当前dp1如果不小于就不操作也就是将其置1初始化时已经置1所以不用操作。
if(nums[i] nums[i-1]) dp[i] dp[i-1]1;
dp数组如何初始化
全部初始化为1
确定遍历顺序
正序遍历即可
举例推导dp数组
class Solution {
public:int findLengthOfLCIS(vectorint nums) {vectorint dp(nums.size(),1);int result 1;for(int i1;inums.size();i){if(nums[i] nums[i-1]){dp[i] dp[i-1]1;}result max(result,dp[i]);}return result;}
};
总结
较为简单
LeetCode 718.最长重复子数组
题目链接力扣LeetCode官网 - 全球极客挚爱的技术成长平台
题目描述给两个整数数组 nums1 和 nums2 返回 两个数组中 公共的 、长度最长的子数组的长度 。
解题思路
确定dp数组dp table以及下标的含义
dp[i][j] 以下标i - 1为结尾的A和以下标j - 1为结尾的B最长重复子数组长度为dp[i][j]。 特别注意 “以下标i - 1为结尾的A” 标明一定是 以A[i-1]为结尾的字符串
确定递推公式
即当A[i - 1] 和B[j - 1]相等的时候dp[i][j] dp[i - 1][j - 1] 1;
不相等就是0了也就不用操作
dp数组如何初始化
全部初始化为0
确定遍历顺序
先遍历数组1或者数组2都可以。
举例推导dp数组
class Solution {
public:int findLength(vectorint nums1, vectorint nums2) {vectorvectorint dp(nums1.size()1,vectorint(nums2.size()1,0));int result 0;for(int i1;inums1.size();i){for(int j1;jnums2.size();j){if(nums1[i-1] nums2[j-1]){dp[i][j] dp[i-1][j-1]1;}result max(result,dp[i][j]);}}return result;}
};
总结
本来以为是要搞几个状态没想到直接用二维来代表俩数组遍历的情况了。