题解 | #子群的标签和#
子群的标签和
https://www.nowcoder.com/practice/4058a95b317f4f0e87e5a1bfa6db9aad
考察的知识点:哈希;
解答方法分析:
- 函数subarraySum接受一个整数数组nums和一个目标值k作为输入,并返回一个二维数组result,其中每个子数组的元素之和等于k。
- 函数中使用了两层循环,外层循环遍历数组的起始位置left,内层循环遍历数组的结束位置right。
- 在内层循环中,计算从left到right位置的子数组的元素之和sum,并与目标值k进行比较。
- 当sum等于k时,将子数组存储到result中。
- 为了避免重复的子数组被存储,使用了一个unordered_map resultMap来记录已经出现过的子数组。
- 在找到一个满足条件的子数组时,将其转换成字符串形式,并作为key存储到resultMap中。
- 如果该子数组还没有出现过,则将其添加到result中,并更新resultMap。
- 最后,返回result。
所用编程语言:C++;
完整编程代码:↓
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型vector
* @param k int整型
* @return int整型vector<vector<>>
*/
vector<vector<int> > subarraySum(vector<int>& nums, int k) {
vector<vector<int>> result;
unordered_map<string, vector<int>> resultMap;
int size = nums.size();
int sum = 0;
for (int left = 0; left < size; left++) {
sum = 0;
for (int right = left; right < size; right++) {
sum += nums[right];
if (sum == k) {
vector<int> subarray(nums.begin() + left, nums.begin() + right + 1);
stringstream ss;
for (int num : subarray) {
ss << num << ",";
}
string subarrayStr = ss.str();
if (resultMap.find(subarrayStr) == resultMap.end()) {
resultMap[subarrayStr] = subarray;
result.push_back(subarray);
}
}
}
}
return result;
}
};



