1. 程式人生 > 其它 >leetcode-523 連續的子陣列和

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