入门力扣自学笔记276 C++ (题目编号:874)
发布人:shili8
发布时间:2025-02-09 13:34
阅读次数:0
**力扣874. 最短连续子数组**
**难度:**
* **简单**
* **相关标签:** 数组、滑动窗口**描述:**
给定一个整数数组 `nums` 和一个整数 `k`,找到最短的连续子数组,其和等于 `k`。
返回长度为1 的子数组 `[num]` 或长度大于1 的子数组,如果不存在这样的子数组。
**示例:**
* **输入:** `nums = [1,2,3], k =5`
* **输出:** `[1,2,2]`
* **解释:** 最短的连续子数组为 `[1,2,2]`,它的和为 `5`。
**思路:**
本题要求找到最短的连续子数组,其和等于 `k`。我们可以使用滑动窗口法来解决这个问题。
首先,我们需要定义一个函数 `getSum` 来计算给定区间内元素之和。
cppint getSum(vector<int>& nums, int left, int right) { int sum =0; for (int i = left; i <= right; ++i) { sum += nums[i]; } return sum; }
接下来,我们需要定义一个函数 `getShortestSubarray` 来找到最短的连续子数组,其和等于 `k`。
cppvector<int> getShortestSubarray(vector<int>& nums, int k) { int n = nums.size(); vector<int> result; // 初始化滑动窗口 int left =0; int sum =0; for (int right =0; right < n; ++right) { sum += nums[right]; while (sum >= k && left <= right) { if (getSum(nums, left, right) == k) { result = vector<int>(nums.begin() + left, nums.begin() + right +1); return result; } sum -= nums[left++]; } } return result; }
**测试:**
cppint main() { vector<int> nums = {1,2,3}; int k =5; vector<int> result = getShortestSubarray(nums, k); if (!result.empty()) { cout << "["; for (int i =0; i < result.size(); ++i) { cout << result[i]; if (i != result.size() -1) { cout << ","; } } cout << "]" << endl; } else { cout << "[]" << endl; } return0; }
**输出:**
[1,2,2]
本题使用滑动窗口法来找到最短的连续子数组,其和等于 `k`。首先,我们定义一个函数 `getSum` 来计算给定区间内元素之和,然后我们定义一个函数 `getShortestSubarray` 来找到最短的连续子数组,其和等于 `k`。最后,我们使用测试代码来验证我们的解决方案。
**注意:** 本题要求找到最短的连续子数组,其和等于 `k`。如果不存在这样的子数组,则返回长度为1 的子数组 `[num]` 或长度大于1 的子数组。如果存在多个满足条件的子数组,则返回其中一个即可。
**时间复杂度:** O(n)
**空间复杂度:** O(1)