하위 배열 및 질문

접두사 해시가 잘못되어
슬라이딩 창까지
---鲁迅

접두사 해시

560. 합계가 K 인 하위 배열 (하위 배열의 수를 계산)

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 (통계적 하위 배열의 최대 길이)와 같은 가장 긴 하위 배열의 길이

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. 연속 하위 배열 합계

523. 연속 하위 배열 합계

무료 시청

슬라이딩 윈도우

209. 가장 작은 하위 배열

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;
    }
};

추천

출처blog.csdn.net/TQCAI666/article/details/114987924