大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。

题目考察的知识点

  • 数组遍历与子数组处理
  • 哈希表的使用

题目解答方法的文字分析

  1. 创建一个哈希表 unordered_map<int, vector<vector<int>>>,用于存储和为 k 的连续子数组,其中键为和值 k,值为和为 k 的连续子数组的集合。
  2. 遍历数组 nums,同时维护一个变量 sum 表示当前连续子数组的和。
  3. 在遍历的过程中,记录每个和为 k 的连续子数组的起始和结束索引,并将其加入到哈希表中。
  4. 如果当前和 sum 减去 k 在哈希表中存在,说明从某个索引开始到当前索引的连续子数组的和为 k,将该连续子数组加入到哈希表中,并记录其起始和结束索引。
  5. 遍历完成后,从哈希表中取出所有和为 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;
    }
};

您的关注、点赞、收藏就是我创作的动力,三连支持阿Q!