(力扣每日一题)有序矩阵中第K小的元素

最长重复子数组

给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。
说明:
1 <= len(A), len(B) <= 1000
0 <= A[i], B[i] < 100
解题思路
1、利用滑动窗口将两个数值进行对齐,最长重复子数组在 A 和 B 中的开始位置相同,我们就可以对这两个数组进行一次遍历,得到子数组的长度。
2、对齐的方式有两类:第一类为 A 不变,B 的首元素与 A 中的某个元素对齐;第二类为 B 不变,A 的首元素与 B 中的某个元素对齐。
在这里插入图片描述

class Solution:
    def findLength(self, A: List[int], B: List[int]) -> int:    
    #定义maxLength函数    
        def maxLength(addA: int, addB: int, length: int) -> int:
            ret = k = 0
    #比较对齐的数的元素是否一致
            for i in range(length):
                if A[addA + i] == B[addB + i]:
                    k += 1
                    ret = max(ret, k)
                else:
                    k = 0
            return ret
       #n,m为A,B数组的长度
        n, m = len(A), len(B)
        ret = 0
   #A不变B滑动(B的首元素与A中某个元素对齐)length为A中未对齐的元素
        for i in range(n):
            length = min(m, n - i)
            ret = max(ret, maxLength(i, 0, length))
  #B不变A滑动(A的首元素与B中某个元素对齐)length为B中未对齐的元素
        for i in range(m):
            length = min(n, m - i)
            ret = max(ret, maxLength(0, i, length))
        return ret
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值