主页 > 互联网  > 

算法训练营第五十二天|300.最长递增子序列674.最长连续递增序列718.最长重复子数组


目录 Leetcode300.最长递增子序列Leetcode674. 最长连续递增序列Leetcode718. 最长重复子数组

Leetcode300.最长递增子序列

文章链接:代码随想录 题目链接:300.最长递增子序列

思路:数组存在就至少为一,dp元素初始化为1

class Solution { public: int lengthOfLIS(vector<int>& nums) { if (nums.size() == 1) return 1; vector<int> dp(nums.size(), 1); int result = 1; for (int i = 1; i < nums.size(); i++){ for (int j = 0; j < i; j++){ if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1); } result = result > dp[i] ? result : dp[i]; } return result; } }; Leetcode674. 最长连续递增序列

文章链接:代码随想录 题目链接:674. 最长连续递增序列

思路:连续的话,比较相邻元素即可。

class Solution { public: int findLengthOfLCIS(vector<int>& nums) { vector<int> dp(nums.size(), 1); int result = 1; for (int i = 1; i < nums.size(); i++){ if (nums[i] > nums[i - 1]) dp[i] = dp[i - 1] + 1; result = result > dp[i] ? result : dp[i]; } return result; } }; Leetcode718. 最长重复子数组

文章链接:代码随想录 题目链接:718. 最长重复子数组

思路:二维数组,创建数组时多建一层是为了避免初始化,否则就得在循环前先初始化一遍dp[i][0]和dp[0][j]。

class Solution { public: int findLength(vector<int>& nums1, vector<int>& nums2) { vector<vector<int>> dp(nums1.size() + 1, vector<int>(nums2.size() + 1)); int result = 0; for (int i = 1; i <= nums1.size(); i++){ for (int j = 1; j <= nums2.size(); j++){ if (nums1[i - 1] == nums2[j - 1]){ dp[i][j] = dp[i - 1][j - 1] + 1; } result = result > dp[i][j] ? result : dp[i][j]; } } return result; } };

滚动(一维)数组,不等要有赋0操作。理论上说不等也最起码有dp[j - 1]个子字符串相等,但是这个值会影响下一层的判断,若下一层的两元素相等,则会得出错误结果,故不等需要赋0。而每个相等字符串的长度都会有一个元素记录过,无需担心漏记。 和背包问题同样 j 的后序遍历是为了避免错误累加。

class Solution { public: int findLength(vector<int>& nums1, vector<int>& nums2) { vector<int> dp(nums2.size() + 1); int result = 0; for (int i = 1; i <= nums1.size(); i++){ for (int j = nums2.size(); j > 0; j--){ if (nums1[i - 1] == nums2[j - 1]){ dp[j] = dp[j - 1] + 1; }else dp[j] = 0; result = result > dp[j] ? result : dp[j]; } } return result; } };

第五十二天打卡,加油!!!

标签:

算法训练营第五十二天|300.最长递增子序列674.最长连续递增序列718.最长重复子数组由讯客互联互联网栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“算法训练营第五十二天|300.最长递增子序列674.最长连续递增序列718.最长重复子数组