LeetCode—最长重复子数组(DP)

    技术2022-07-10  133

    最长重复子数组(中等)

    2020年7月1日

    题目来源:力扣

    解题

    刷了三个月简单题入门了一下,现在开始刷每日一题

    这个最长重复子数组,用动态规划的方式比较好做,dp数组每次都记录是否相等,如果相等就在上一个数那里加一。

    class Solution { public int findLength(int[] A, int[] B) { int max=0; int alen=A.length; int blen=B.length; int[][] dp=new int[alen+1][blen+1]; for(int i=1;i<=alen;i++){ for(int j=1;j<=blen;j++){ if(A[i-1]==B[j-1]){ dp[i][j]=dp[i-1][j-1]+1; max=Math.max(max,dp[i][j]); } } } return max; } }

    DP二维数组改一维数组

    由二维数组可知,dp[i][j]=dp[i-1][j-1]+1。那么可以发现这个矩形是斜线递增的,而且每次都只是依赖上一行的数据,那么改写成一维数组,这里要注意,后面的数据是依赖于前面的数据,前面的数据是用来推导后面的数据,所以前面的数据不依赖后面的数据,我们就需要从后面开始对比,以免影响结果。 还有因为是一维数组,所以不相等的要实时刷新为0。

    class Solution { public int findLength(int[] A, int[] B) { int max=0; int alen=A.length; int blen=B.length; int[] dp=new int[blen+1]; for(int i=1;i<=alen;i++){ for(int j=blen;j>=1;j--){ if(A[i-1]==B[j-1]){ dp[j]=dp[j-1]+1; max=Math.max(max,dp[j]); } else dp[j]=0; } } return max; } }

    Processed: 0.014, SQL: 9