leetcode-523 连续的子数组和

leetcode-523 连续的子数组和

解题思路

  1. 前缀和 超时 复杂度(\(O(n^2)\))
    使用一维矩阵sum_matrix存储前缀和,\(summatrix[i]\)表示\(0-i\)元素连续的子数组和,则\(summatrix[j]-summatrix[i]\)表示\(i-j\)元素的子数组和,则条件成立时满足:

    \[(summatrix[j]-summatrix[i])%k==0 and j-i>1 \]

  2. 前缀和+map 复杂度(\(O(n)\))
    对于一个数组\([a,b,c,d,e]\)

    \[a+b+c=k*x+rem \]

    \[a+b+c+d+e=k*y+rem \]

    \[c+d=(y-x)*k \]

    所以只需要保证前缀和数组中对k的余数相同即可,使用一个map/字典存储,结构为{余数:位置},如果当前余数在map中存在,则\((summatrix[j]-summatrix[i])%k==0\)该条件成立,只需要判断其位置距离是否大于2,如果不存在,将其加入字典中。

代码

  1. 前缀和
class Solution: 
    def checkSubarraySum(self, nums, k: int) -> bool:
        length=len(nums)
        sum_matrix=[0]*(length+1)
        for i in range(1,length+1):
            sum_matrix[i]=sum_matrix[i-1]+nums[i-1]
        for i in range(length+1):
            for j in range(i+1,length+1):
                if (summatrix[j]-summatrix[i])%k==0 and j-i>1:
                    return True
        return False
  1. 前缀和+map
class Solution: 
    def checkSubarraySum(self, nums, k: int) -> bool:
        sum_map={}
        sum_map[0]=-1
        cur=0
        for i in range(len(nums)):
            if ((cur+nums[i])%k) in sum_map.keys():
                if i-sum_map[(cur+nums[i])%k]>1:
                    return True
            else:
                sum_map[(cur+nums[i])%k]=i
            cur=cur+nums[i]
        return False
posted @ 2021-10-16 10:43  流光之中  阅读(42)  评论(0编辑  收藏  举报