算法学习打卡计划

leetcode第五百六十题—和为K的子数组

2020-03-13  本文已影响0人  不分享的知识毫无意义

刷题一时爽,一直刷题一时爽。
终于知道哈希是什么了。

1.题目

原题

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

例子

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

2.解析

思路1:还是双指针,但是讨论了一番以后,发现不能解决从0开始的数组之和小于目标值情况。
想想还是算了。
思路2:哈希表,建一个字典,这个字典存的东西是到第i个数的和。考虑这样一个性质,如果到第j个数的和减到第i个数的和得到的值为k,那么这个i到j的连续子数组和肯定为K。定义一个字典,key为累积和,value为累积和出现的次数,这样所有的连续数组都可以找到了。

3.python代码

##双指针法,这个有个情况解决不了,但思路还是挺好的
    def subarraySum(self, nums, k):
        start, end = 0, 0
        count = 0
        tmpsum = nums[0]
        m = len(nums)
        while start < m and end < m:
            print(start, end, tmpsum)
            if tmpsum == k:
                count += 1
                if start < m - 1:
                    start += 1
                    end = start
                    tmpsum = nums[start]
                else:
                    break
            elif tmpsum > k:
                tmpsum = tmpsum - nums[start]
                start += 1
            else:
                if end < m-1:
                    end += 1
                    tmpsum = tmpsum + nums[end]
                else:
                    break
        return count
##归纳法
    def subarraySum(self, nums, k):
        d = {0: 1}
        m = len(nums)
        sumk = 0
        res = 0
        for i in range(m):
            sumk += nums[i]
            if sumk - k in d:
                res += d[sumk - k]
            if sumk in d:
                d[sumk] += 1
            else:
                d[sumk] = 1
        return res
上一篇下一篇

猜你喜欢

热点阅读