https://leetcode.cn/problems/longest-increasing-subsequence/
这个也是没想出来,需要双循环,注意res初始值为1(1 <= nums.length <= 2500)
赋初始值的方法
Arrays.fill(dp, 1);
class Solution {public int lengthOfLIS(int[] nums) {int[] dp=new int[nums.length];Arrays.fill(dp, 1);int res=1;for(int i=1;ifor(int j=0;jif(nums[i]>nums[j]){dp[i]=Math.max(dp[i],dp[j]+1);}}if(dp[i]>res) res=dp[i];}return res;}
}
https://leetcode.cn/problems/longest-continuous-increasing-subsequence/
连续反而比上一个简单了
class Solution {public int findLengthOfLCIS(int[] nums) {int[] dp=new int[nums.length];Arrays.fill(dp, 1);int res=1;for(int i=1;iif(nums[i]>nums[i-1]){dp[i]=dp[i-1]+1;}if(dp[i]>res) res=dp[i];}return res;}
}
class Solution {public int findLengthOfLCIS(int[] nums) {int dp=1;int res=1;for(int i=1;iif(nums[i]>nums[i-1]){dp++;}else{dp=1;}if(dp>res) res=dp;}return res;}
}
https://leetcode.cn/problems/maximum-length-of-repeated-subarray/
这个感觉也比较难想到。
class Solution {public int findLength(int[] nums1, int[] nums2) {int[][] dp=new int[nums1.length+1][nums2.length+1];int res=0;for(int i=1;ifor(int j=1;jif(nums1[i-1]==nums2[j-1]){dp[i][j]=dp[i-1][j-1]+1;}if(dp[i][j]>res) res=dp[i][j];}}return res;}
}
压缩成一维数组,从后往前遍历就不会重复覆盖了。
class Solution {public int findLength(int[] nums1, int[] nums2) {int[] dp=new int[nums2.length+1];int res=0;for(int i=1;ifor(int j=nums2.length;j>0;j--){if(nums1[i-1]==nums2[j-1]){dp[j]=dp[j-1]+1;}else{dp[j]=0;}if(dp[j]>res) res=dp[j];}}return res;}
}