• 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

  • 相关阅读:
    壶公随感
    消息称微软受谷歌刺激 急于收购雅虎(zz)
    远程注销Windows用户
    "杀人"游戏中的一些规律
    由两点的经纬度估算距离
    我的城市?
    Blog里的一个bug,dudu看能否修正?
    这两天真烦
    发简历,找上海.Net方面软件开发工作
    "上海.NET俱乐部"聚会筹备进展
  • 原文地址:https://www.cnblogs.com/xxswkl/p/12120655.html
Copyright © 2020-2023  润新知