纸上得来终觉浅 绝知此事要躬行

纸上得来终觉浅 绝知此事要躬行

1844 · subarray sum equals to k II
Medium

Description
Solution27
Notes
Discuss55
Leaderboard
Record

Description
Given an array of integers and an integer k, you need to find the minimum size of continuous no-empty subarrays whose sum equals to k, and return its length.

if there are no such subarray, return -1.

Only $39.9 for the “Twitter Comment System Project Practice” within a limited time of 7 days!

WeChat Notes Twitter for more information(WeChat ID jiuzhang15)

the integer nums[i] may lower than 0

Example
Example1

Input:
nums = [1,1,1,2] and k = 3
Output:
2
Example2

Input:
nums = [2,1,-1,4,2,-3] and k = 3
Output:
2

解法1:presums + hashmap
注意:这种有正有负的数组,不可以用滑动窗口,因为当窗口和大于k时,不能确定怎么移动窗口。

class Solution {
public:
    /**
     * @param nums: a list of integer
     * @param k: an integer
     * @return: return an integer, denote the minimum length of continuous subarrays whose sum equals to k
     */
    int subarraySumEqualsKII(vector<int> &nums, int k) {
        int n = nums.size();
        if (n == 0) return k == 0;
        vector<int> presums(n + 1, 0);
        unordered_map<int, int> mp;  //<presum, index>
        mp[0] = 0;
        int minLen = INT_MAX;
        for (int i = 1; i <= n; i++) {
            presums[i] = presums[i - 1] + nums[i - 1];
            if (mp.find(presums[i] - k) != mp.end()) {
                minLen = min(minLen, i - mp[presums[i] - k]);
            }
            mp[presums[i]] = i;
        }
        
        return minLen == INT_MAX ? -1 : minLen;
    }
};
11-01 06:16