大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。
题目考察的知识点
- 数组遍历与子数组处理
- 哈希表的使用
题目解答方法的文字分析
- 创建一个哈希表
unordered_map<int, vector<vector<int>>>
,用于存储和为 k 的连续子数组,其中键为和值 k,值为和为 k 的连续子数组的集合。 - 遍历数组
nums
,同时维护一个变量sum
表示当前连续子数组的和。 - 在遍历的过程中,记录每个和为 k 的连续子数组的起始和结束索引,并将其加入到哈希表中。
- 如果当前和
sum
减去 k 在哈希表中存在,说明从某个索引开始到当前索引的连续子数组的和为 k,将该连续子数组加入到哈希表中,并记录其起始和结束索引。 - 遍历完成后,从哈希表中取出所有和为 k 的连续子数组,并按照升序排列,最后按照字典序对子数组进行排序,并返回结果。
本题解析所用的编程语言
C++
完整且正确的编程代码
#include <vector> #include <unordered_map> #include <algorithm> using namespace std; 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<int, vector<vector<int>>> sums; // 哈希表,键为和值 k,值为和为 k 的连续子数组的集合 int sum = 0; // 当前连续子数组的和 for (int i = 0; i < nums.size(); i++) { sum += nums[i]; // 更新当前连续子数组的和 if (sum == k) { // 如果当前和等于 k,将从开始到当前索引的子数组加入到结果中 result.push_back(vector<int>(nums.begin(), nums.begin() + i + 1)); } if (sums.find(sum - k) != sums.end()) { // 如果当前和减去 k 在哈希表中存在,说明存在一个子数组的和为 k, // 将这些子数组加上当前元素构成的子数组加入到结果中 for (auto& subarray : sums[sum - k]) { result.push_back(vector<int>(nums.begin() + subarray[1] + 1, nums.begin() + i + 1)); } } sums[sum].push_back({sum, i}); // 将当前和及其索引加入到哈希表中,记录该和的位置 } // 对结果进行排序并去重,保证升序且不重复 sort(result.begin(), result.end()); result.erase(unique(result.begin(), result.end()), result.end()); return result; } };