题解 | #子群的标签和#
子群的标签和
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; } };