LeeCode 560. 和为K的子数组 [中等 40.7%]

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

示例 1 :

输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
说明 :

数组的长度为 [1, 20,000]。
数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/subarray-sum-equals-k
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解析:

定义一个子序列用来从左到右读取列表里面的数,满足一下读取方式:

1,子序列的和小于K,则继续读值进来;

2,子序列的和大于K,则删除第一值;

3,子序列的和等于K,则输出;

4,循环1-3,直到所有的列表值读取结束。

优化:

当单个值大于K时,则可以清空子序列,因为不管执行1还是2,肯定结果都大于K。
class Solution:
    def subarraySum(self, nums: list, k: int) -> int:
        sub_array = []  # 存储子序列
        i = 0  # 游标
        length = len(nums)  # 列表长度
        sum_array = 0
        while i < length:
            if nums[i] > k:
                # 当前单个值大于K,那么子序列置空,游标后移
                sub_array.clear()
                sum_array = 0
                i += 1
                continue
            if sum_array < k:
                # 如果子序列的和小于k,则游标继续取值进来,游标后移
                sub_array.append(nums[i])
                sum_array += nums[i]
                i += 1
                continue
            if sum_array > k:
                # 如果子序列值大于k,则把第一个元素值删除
                v = sub_array.pop(0)
                sum_array -= v
                continue

            if sum_array == k:
                # 等于的话就输出,然后为下一步做准备,删除第一个,然后游标取值,再后移
                print(sub_array)
                v = sub_array.pop(0)
                sum_array -= v
                continue

        if sum_array == k:
            print(sub_array)

if __name__ == '__main__':
    nums = [1, 2, 3, 4, 5, 6, 7, 16, 14, 1, 15, 5, 6, 4]
    k = 15
    s = Solution()
    s.subarraySum(nums, k)



输出结果:

D:\Anaconda3\python.exe E:/PythonSpace/560.py
[1, 2, 3, 4, 5]
[4, 5, 6]
[14, 1]
[15]
[5, 6, 4]

Process finished with exit code 0

 

转载于:https://my.oschina.net/gain/blog/3100156

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值