Given an array of integers and an integer k, you need to find the total number of continuous subarrays whose sum equals to k.
Note:
- The length of the array is in range [1, 20,000].
- The range of numbers in the array is [-1000, 1000] and the range of the integer k is [-1e7, 1e7].
給予一個整數陣列和一個整數k,你需要計算有多少連續的子陣列之總和等於k。
注意:
- 陣列的大小範圍為 [1, 20,000]。
- 陣列中的數字大小範圍為 [-1000, 1000] 且k的大小範圍為 [-1e7, 1e7]。
Example 1:
Input:nums = [1,1,1], k = 2
Output: 2
sum[i ,j]
代表從i
加到j
的總和,然後使用兩個迴圈跑i
和j
,找到所有等於k
的子陣列。
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int s = nums.size();
int count = 0;
vector<vector<int>> dp(s, vector<int>(s, 0));
for(int i = 0; i < s; i++)
{
for(int j = i; j < s; j++)
{
if(i == j)
dp[i][j] = nums[j];
else
dp[i][j] = dp[i][j - 1] + nums[j];
if(dp[i][j] == k)
count++;
}
}
return count;
}
};
s
有關,因此時間複雜度為O(n^2)
;送出之後果然吃TLE。sum[i, j]
改為先得到sum[0, 0] ~ sum[0, s - 1]
,也就是先只算原本i = 0
的部分。
[1, 2, 3]
,得到[1, 3, 6]
。sum[i, j]
其實就等於sum[0, j] - sum[0, i]
。hash[x]
代表目前所有k + sum[0, i] = x
的數量。(也就是說x - sum[0, i]= k
)sum[0, i]
後,檢查hash[sum[0, i]]
是否有值(配對成功)。hash[k] = 1
來初始化即可。O(n)
。
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int s = nums.size();
int count = 0;
vector<int> sum_vector(s + 1, 0);
unordered_map<int, int> hash;
hash[k] = 1;
for(int i = 0; i < s; i++)
{
sum_vector[i + 1] = sum_vector[i] + nums[i];
count += hash[sum_vector[i + 1]];
hash[k + sum_vector[i + 1]] = hash[k + sum_vector[i + 1]] + 1;
}
return count;
}
};
LeetCode
C++