美文网首页算法学习打卡计划
leetcode第五百六十题—和为K的子数组

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

作者: 不分享的知识毫无意义 | 来源:发表于2020-03-13 08:56 被阅读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
    

    相关文章

      网友评论

        本文标题:leetcode第五百六十题—和为K的子数组

        本文链接:https://www.haomeiwen.com/subject/smrfshtx.html