当前位置:实例文章 » 其他实例» [文章]入门力扣自学笔记276 C++ (题目编号:874)

入门力扣自学笔记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)

其他信息

其他资源

Top