leetcode-523 連續的子陣列和
阿新 • • 發佈:2021-10-16
leetcode-523 連續的子陣列和
解題思路
- 字首和 超時 複雜度(\(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 \] - 字首和+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\)
程式碼
- 字首和
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
- 字首和+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