• 0718最长重复子数组 Marathon


    给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。

    示例:

    输入:
    A: [1,2,3,2,1]
    B: [3,2,1,4,7]
    输出:3
    解释:
    长度最长的公共子数组是 [3, 2, 1] 。

    提示:

    1 <= len(A), len(B) <= 1000
    0 <= A[i], B[i] < 100

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray

    参考:

    python

    # 0718.最长重复子数组
    
    class Solution:
        def maxLengthOfSubarr(self, nums1: [int], nums2: [int]) -> int:
            """
            动态规划,最大重复子数组-二维数组
            1.dp定义及下标
            - dp[i][j], 下标i-1结尾的nums1数组,与下标j-1结尾的nums2数组的,最长重复子数组长度
            2.递推公式
            - dp[i][j] = dp[i-1][j-1] + 1
            3.初始化
            - dp[0][i] = dp[i][0] = 0
            4.遍历顺序
            - 先1后2,或者先2后1
            :param nums1:
            :param nums2:
            :return:
            """
            dp = [[0]*(len(nums2)+1) for _ in range(len(nums1)+1)]
            res = 0
            for i in range(1, len(nums1)+1):
                for j in range(1, len(nums2)+1):
                    if nums1[i-1] == nums2[j-1]:
                        dp[i][j] = dp[i-1][j-1] + 1
                    res = max(res, dp[i][j])
            return res
    
        def maxLengthOfSubarr_(self, nums1: [int], nums2: [int]) -> int:
            """
            动态规划,最大重复子数组-滚动数组
    
            :param nums1:
            :param nums2:
            :return:
            """
            dp = [0] * (len(nums2)+1)
            res = 0
            for i in range(1, len(nums1)+1):
                for j in range(len(nums2), 0, -1): # 避免重复覆盖
                    if nums1[i-1] == nums2[j-1]:
                        dp[j] = dp[j-1] + 1
                    else:
                        dp[j] = 0 # update
                    res = max(res, dp[j])
            return res
    

    golang

    package dynamicPrograming
    
    
    // 动态规划-二维数组
    func maxLengthOfSubarr(nums1, nums2 []int) int {
    	dp := make([][]int, len(nums1)+1)
    	for i:=0;i<=len(nums1);i++ {
    		dp[i] = make([]int, len(nums2)+1)
    	}
    	res := 0
    	for i:=1;i<=len(nums1);i++ {
    		for j:=1;j<=len(nums2);j++ {
    			if nums1[i-1] == nums2[j-1] {
    				dp[i][j] = dp[i-1][j-1] + 1
    			}
    			res = max(res, dp[i][j])
    		}
    	}
    	return res
    }
    
    // 动态规划-一维数组/滚动数组
    func maxLengthOfSubarr_(nums1, nums2 []int) int {
    	dp := make([]int, len(nums2)+1)
    	res := 0
    	for i:=0;i<=len(nums2);i++ {
    		dp[i] = 0
    	}
    	for i:=1;i<=len(nums1);i++ {
    		for j:=len(nums2);j>=1;j-- {
    			if nums1[i-1] == nums2[j-1] {
    				dp[j] = dp[j-1] + 1
    			} else {
    				dp[j] = 0
    			}
    			res = max(res, dp[j])
    		}
    	}
    	return res
    }
    
    func max(a,b int) int {
    	if a > b {return a}
    	return b
    }
    
  • 相关阅读:
    ThinkPHP中的CURD操作
    安卓自写Adapter
    安卓 报错 Check the Eclipse log for stack trace.
    web开发 关于src跳转
    javascript入门学习笔记2
    javascript入门学习笔记
    最全java的读写操作(转载)
    http请求的cookie
    java 安卓开发之文件的读与写
    转 安卓控件属性大全
  • 原文地址:https://www.cnblogs.com/davis12/p/15644741.html
Copyright © 2020-2023  润新知