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
法二:
思路: 通过观察可以看出,每个能够整除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)
ddd