523连续的子数组和

题目: 给定一个包含非负数的数组和一个目标整数 k,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,总和为 k 的倍数,即总和为 n*k,其中 n 也是一个整数。

来源: https://leetcode-cn.com/problems/continuous-subarray-sum/

法一: 自己的代码

思路: 暴力遍历,逐个验证.非常耗时!

from typing import List
class Solution:
    def checkSubarraySum(self, nums: List[int], k: int) -> bool:
        l = len(nums)
        if l == 1:
            return False
        if k == 0:
            for i in range(l - 1):
                s = nums[i]
                while i < l - 1:
                    i += 1
                    s = s + nums[i]
                    if s == 0:
                        return True
        else:
            for i in range(l-1):
                s = nums[i]
                while i < l-1:
                    i += 1
                    s = s + nums[i]
                    if s % k == 0:
                        return True
        return False
View Code

法二:

思路: 通过观察可以看出,每个能够整除k的连续字符串的左边和右边的字符串除k后的余数是相等的.利用这个可以判断建立一个字典进行判断.时间复杂度为O(n).

class Solution(object):
    def checkSubarraySum(self, nums, k):
        # 利用字典记录每个连续子串的余数
        lookup = {}
        # 由于0比较特殊,特别建一个k-v对来判断
        lookup[0] = -1
        summing = 0
        n = len(nums)
        # if n < 2 : return False
        for i in range(0,n):
            # 连续数组的和
            summing += nums[i]
            # 如果除数k不为0,令summing为除k后的余数
            if k!= 0:summing %= k
            # 如果之前没有相同的余数,则返回None
            pre = lookup.get(summing,None)
            # 如果为None,说明没有相同余数的序列,则把余数记录到字典中,继续遍历.
            # 否则有,
            if pre != None:
                # 当除数为0的时候,要判断是否有连续两个0
                if i - pre > 1:
                    return True
            else:
                lookup[summing] = i
        return False
if __name__ == '__main__':
    duixiang = Solution()
    # a = duixiang.checkSubarraySum([23,2,6,4,7],8)
    a = duixiang.checkSubarraySum([0,0],0)
    print(a)
View Code

ddd

posted on 2019-12-30 17:02  吃我一枪  阅读(189)  评论(0编辑  收藏  举报

导航