Day52 题目
LeetCode300最长递增子序列
核心思想:dp数组存放目前为止最长子序列长度,因为是序列,所以要从找到比他小的前面所有的内容,找到最长的那个
class Solution {public int lengthOfLIS(int[] nums) {int[] dp = new int[nums.length+1];dp[0] = 0;int max = 0;for(int i = 1 ; i < nums.length ; i ++){for(int j = 0 ; j < i ; j ++){if( nums[j] < nums[i]){dp[i] = Math.max(dp[i],dp[j]+1);}}max = Math.max(dp[i],max);}return max+1;}
}
LeetCode674最长连续递增序列
核心思想:这个题目和上面题目的区别是这个要求是连续的,那么如果不是递增的就重置为0就行了
class Solution {public int findLengthOfLCIS(int[] nums) {int[] dp = new int[nums.length];int max = 0;for(int i = 1 ; i < nums.length ; i ++){if(nums[i] > nums[i-1]){dp[i] = dp[i-1]+ 1;}else{dp[i] = 0;}max = Math.max(dp[i],max);}return max+1;}
}
LeetCode718最长重复连续子序列
核心思想:需要用到二维dp数组 dp[i][j]表示第一个数组的前i个元素和第二个数组的前j个元素的最长序列长度
class Solution {public int findLength(int[] nums1, int[] nums2) {// dp[i][j] 是 nums1 中前i个 nums2 中前j个字符之间的最长子数组长度int[][] dp = new int[nums1.length+1][nums2.length+1];int max = 0;for(int i = 1 ; i <= nums1.length ; i ++){for(int j = 1 ; j <= nums2.length ; j ++){if(nums1[i-1] == nums2[j-1]){dp[i][j] = dp[i-1][j-1] + 1;max = Math.max(dp[i][j],max);}else{// 因为是连续的,如果不同的话就得重置为0dp[i][j] = 0;}}}return max;}
}