명
접두사 해시가 잘못되어
슬라이딩 창까지
---鲁迅
기사 디렉토리
접두사 해시
560. 합계가 K 인 하위 배열 (하위 배열의 수를 계산)
양의 정수에 대한 제약이 없기 때문에 슬라이딩 윈도우를 사용할 수 없습니다.
접두사 및 + 해시 테이블
class Solution:
def subarraySum(self, nums: List[int], k: int) -> int:
mp=collections.defaultdict(int)
mp[0]=1
pre=0
count=0
for num in nums:
pre+=num
if pre-k in mp:
count+=mp[pre-k]
mp[pre]+=1
return count
325. 합계가 k (통계적 하위 배열의 최대 길이)와 같은 가장 긴 하위 배열의 길이
class Solution:
def maxSubArrayLen(self, nums: List[int], k: int) -> int:
n=len(nums)
# 上题存个数,这题存下标
pre_idx = defaultdict(int)
res=0
pre=0
# 忘了写这个
pre_idx[0] = -1
for i in range(n):
pre+=nums[i]
if pre not in pre_idx:
pre_idx[pre]=i
if pre-k in pre_idx:
res=max(res, i-pre_idx[pre-k])
return res
523. 연속 하위 배열 합계
무료 시청
슬라이딩 윈도우
209. 가장 작은 하위 배열
슬라이딩 윈도우를 사용하는 양의 정수 제약 조건이 있습니다 . O (n) O (n)O ( n )
하지만 접두사와 + 이분법을 사용할 수도 있습니다. O (n log n) O (n \ log n)O ( n싸다 gn )
class Solution {
public:
int minSubArrayLen(int target, vector<int> &nums) {
int sum = 0, l = 0, sz = nums.size() + 1;
for (int r = 0; r < nums.size(); ++r) {
sum += nums[r];
while (sum >= target) {
int cur_sz = r - l + 1;
if (cur_sz < sz) sz = cur_sz;
sum -= nums[l++];
}
}
return sz == nums.size() + 1 ? 0 : sz;
}
};