k的倍数(同模相减-美团笔试编程题)

针对给定序列与整数k,使用动态规划方法找到元素和为k倍数的最长子串长度。通过优化算法实现O(n)的时间复杂度。

问题描述:

序列中任意个连续的元素组成的子序列成为该序列的子串。现在给你一个序列p和一个整数k,询问元素和是k的倍数的子串的最大长度。比如序列[1,2,3,4,5],给定的k为5,其中满足条件的串子串为[5],[2,3],[1,2,3,4,5].所以答案是5

输入描述:

第一行一个整数n (1<=n<=10^5)

第二行n个整数的序列p(1<=pi<=10^5)

第三行含一个整数k(1<=k<=10^5)

输出描述:

输出一个ANS,表示答案

分析思路:

本人用的是python,刚开始想用暴力求解,但看数据o(n^2),必然WA,所以想用动态规划加二分求解,但还是挂了。后来想到了将动态规划降维的方法,即转化为利用sum[i]-sum[j]=t*k求i,j的最大距离。将p前缀加一个[0],便于统一下标。先遍历一遍p,从一个逐个相加,结果每个p[i]代表前p[:i+1]的和,每求一次,对t=p[i]%k。这里用一个r数组,存在余数对应位置存该余数出现的下标(这里有点拗口,即利用了r的下标即代表一个余数,这里就相当于降维了)。然后再定义一个数组ans,用于存储间隔值。下标即余数值,最终指出现p中的每项取余得到的相同余数的间隔最大值,存储在相应余数所对的下标中。现在回到r数组,至于r数组怎么跟ans何用呢?就是取余之后进行判断,如果r之前没存这个余数,说明这个余数第一次出现,存下下标(此处下标指的是遍历p的下标)。如果不是第一次出现,则计算距离第一次下标的值,并比较ans中相应余数对应的下标的ans值取大值。依次类推,然后最终求最大值。即答案。整个过程只需在遍历p求和的过程中即可完成,时间复杂度为o(n)。这里利用r和ans两个数组以及余数与下标相等的巧妙性将二维降成了一维。

ps:这里余数对应的下标,即余数值与下标值相等。

代码实现:

#-*-coding:utf-8 -*-
while True:
    try:
        n=int(raw_input())
        res=map(int,raw_input().split())
        k=int(raw_input())
        res=[0]+res
        r=[-1 for i in range(n+1)]
        ans=[-1 for i in range(n+1)]
        r[0]=0
        for i in range(1,n+1):
            res[i]+=res[i-1]
            t=res[i]%k
            if r[t]!=-1:
                m=i-r[t]
                ans[t] = max(m, ans[t])
            else:
                r[t]=i

        print max(0,max(ans))
    except:
        break


### 回答1: 在MATLAB中,实现车牌相减的一种方法是使用图像处理工具箱中的函数。首先,我们需要将车牌图像和车牌板图像加载到MATLAB中,可以使用imread函数完成。然后,可以使用imsubtract函数将车牌图像减去车牌板图像,得到两者的差异图像。差异图像中的正值表示车牌图像中与板不一致的部分,而负值则表示车牌图像中与板一致的部分。可以使用imshow函数显示差异图像,以便观察和分析车牌图像与板的不之处。根据具体需求,我们可以对差异图像进行二值化处理,以提取出与板不一致的部分。这可以通过im2bw函数完成,设置适当的阈值即可。最后,使用imwrite函数将处理后的差异图像保存到指定位置。除了使用imsubtract函数之外,还可以使用其他图像处理函数,例如imabsdiff和imsubtract函数等,以达到相似的效果。总之,在MATLAB中实现车牌相减可通过图像处理函数来处理差异,并最终得到车牌图像与板之间的差异部分。 ### 回答2: 在MATLAB中,车牌相减是指将两个车牌板进行相减操作,以获得它们的差异。车牌板一般是用于识别车辆的特定区域,其中包含了车牌的图像信息。通过将两个车牌相减,可以找出它们之间的不之处。 实现车牌相减的方法如下: 1. 首先,将两个车牌板的图像加载到MATLAB中,并将它们转换为灰度图像。 2. 然后,使用imsubtract函数将两个灰度图像进行相减操作。这将生成一个新的图像,其中包含了两个车牌板之间的差异。该函数的使用方法如下: ```matlab diff_image = imsubtract(template1, template2); ``` 3. 进一步处理生成的差异图像,以突出显示车牌板之间的不之处。比如,可以使用imbinarize函数将图像二值化,将不的区域标记为白色,相的区域标记为黑色: ```matlab binary_diff = imbinarize(diff_image); ``` 4. 最后,可以显示生成的差异图像和处理后的二值化图像,以便观察车牌板之间的差异情况。可以使用imshow函数显示图像: ```matlab subplot(1, 2, 1); imshow(diff_image); title('差异图像'); subplot(1, 2, 2); imshow(binary_diff); title('二值化差异图像'); ``` 通过这个过程,我们可以对比两个车牌板的不之处,并进一步处理差异图像以获得更好的可视化效果。这对于识别和比较车辆的不车牌板非常有用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值