数组中连续子数组和

来源:互联网 发布:数据挖掘模型分类 编辑:程序博客网 时间:2024/05/20 07:36

1、LeetCode上209号问题给定一个整型数组s,找到数组中最短的一个连续子数组,使得连续子数组的数字和sum>=s,返回这个最短的连续子数组的返回值。
如-给定的数组[2,3,1,2,4,3] s=7;
答案为[4,3]返回的是2。
这里当没有sum>=s情况的时候,返回0;

#include <iostream>#include <cassert>#include <vector>#include<algorithm>using namespace std;// 暴力解法// 时间复杂度: O(n^3)// 空间复杂度: O(1)class Solution {public:    int minSubArrayLen(int s, vector<int>& nums) {        int res = nums.size() + 1;        for (int l = 0; l < nums.size(); l++){        for (int r = l; r < nums.size(); r++){            int sum = 0;            for (int i = l; i <= r; i++)                sum += nums[i];            if (sum >= s)                res = min(res, r - l + 1);        }        if (res == nums.size() + 1)            return 0;        }        return res;    }};//时间复杂度O(n)两个索引分别从前向后从后向前共遍历数组一遍//空间复杂度O(1)没有开辟任何新的内存class Solution{public:    int minSubArrayLen(int s, vector<int>&nums){        int l = 0, r = -1;//nums[l...r]为我们的滑动窗口        int sum = 0;        int res = nums.size() + 1;        while (l < nums.size()){            if ((r+1)<nums.size() && sum < s){                r++;                sum += nums[r];            }            else                      sum -= nums[l++];            if (sum >= s)                res = min(res, r - l + 1);        }        if (res == nums.size() + 1)            return 0;        return res;    }};int main() {    int nums[] = { 2, 3, 1, 2, 4, 3 };    vector<int> vec(nums, nums + sizeof(nums) / sizeof(int));    int s = 7;    cout << Solution().minSubArrayLen(s, vec) << endl;    return 0;}
0 0
原创粉丝点击