算法::最长无重复子数组

本文以易懂方式介绍了如何用Python实现最长无重复子数组的解决方案,通过比喻快慢两个人的移动规则,展示了动态规划在解决此问题中的应用。
摘要由CSDN通过智能技术生成

最长无重复子数组

拟人算法系列文章,以容易理解的方式描述算法,点赞收藏不迷路

class Solution:
    def maxLength(self, arr: list[int]) -> int:
        if not arr:
            return 0

        i = 0
        max_length = 0
        j_last_position: dict[int, int] = {}

        for j in range(len(arr)):
            if arr[j] in j_last_position:
                i = max(i, j_last_position[arr[j]] + 1)
            j_last_position[arr[j]] = j
            max_length = max(max_length, j - i + 1)

        return max_length


if __name__ == '__main__':
    arr = [1, 2, 3, 2, 1]
    s = Solution()
    print(s.maxLength(arr))  # 3

好比一快一慢两个人,他们都从数组起点开始,走的快的人,每走一步都会记录自己的位置,并且会先判断自己当前是否重复,如果重复,则让走的慢的人移动到:自己上一次出现位置的下一个和慢的人当前位置中的较大者处,保证快慢两人之间没有重复,同时更新最新的最大距离

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值