python vector_leetcode 560 相加和为K的顺序子序列个数 python解决

065d02344f7f4e56461cea9f088645e6.png

在python 语言中,解决这道题,使用暴力方法一定会遇到超时的问题,为此使用类似hash表的‘巧妙'一点的O(n)的方法。

Loading...​leetcode.com
81c2eacdf688232d9fcb8a1bb3075c36.png

题目描述:

给定一个整数数组和一个整数k,你需要找到该数组中和为k的连续的子数组的个数。

最容易想到是使用暴力的解法,先确定子序列的起始位置,起始位置可以是从0,1,……开始,然后遍历计算每个开始位置上的序列和,写出如下算法

def 

ad96713628042a12ef8b46c667ab4695.png

这样可以得到正确结果,但是会得到超时的问题。

下面使用字典记录之前存在的累加和的值,每次得到一个累加和sum,判断k-sum,如果有的话,从出现位置截胡,就可以得到和k。

from collections import defaultdict
def sum_k(vector,k):
    array_num=len(vector)
    sums_so_far=defaultdict(int)
    numbers=0
    sum_array=0
    for i in range(array_num):
        sum_array+=vector[i]
        if sum_array==k:
            numbers+=1
        if (sum_array-k) in sums_so_far:
            numbers+=sums_so_far[sum_array-k]
        sums_so_far[sum_array]+=1
    return numbers
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值