每日一题算法:2020年7月1日 最长重复子数组 findLength

本文探讨了寻找两个数组中最长重复子数组的问题。首先尝试暴力算法和哈希表+链表的解决方案,然后通过优化数据结构降低复杂度。最终采用动态规划的方法,解释了动态规划的核心思想,并描述了如何利用它来解决问题。虽然实现了动态规划解法,但官方最优算法仍有一定理解难度。
摘要由CSDN通过智能技术生成

2020年7月1日 最长重复子数组 findLength

在这里插入图片描述

默认格式:

class Solution {
   
    public int findLength(int[] A, int[] B) {
   

    }
}

解题思路:

1,暴力算法

遍历数组1中的每一个元素

用这个元素和数组2的每一个元素对比,如果相同

循环读取两个数组的下一个元素,直到不相同为止

这个算法太复杂,就不做实现了。

2,使用哈希表+链表

遍历一遍数组1,将其每个元素出现的位置存入到一个List中,然后存入hashmap中。

遍历数组2,每个元素在哈希表中是否存在,如果存在,遍历这个List中的所有位置,对这些位置进行测试,找出最大长度
在这里插入图片描述

写的时候已经发现了,用哈希表来存并没有减少核心部分的时间,时间复杂度依然很高。

    public int findLength(int[] A, int[] B) {
   

        int max=0;

        //构建一个HashMap来存地址
        HashMap<Integer, List<Integer>> map=new HashMap<>();
        for (int i=0;i<A.length;i++){
   
            if (map.get(A[i])==null){
   
                List<Integer> list=new LinkedList<>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值