leetcode 209 长度最小的子数组

简介: leetcode 209 长度最小的子数组

长度最小的子数组

第一次自己答

超出时间范围,时间复杂度太高

#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int sum = 0, size=0,subsize=0 ;
        for (int j = 0; j < nums.size(); j++)
        {
            for (int i = j; i < nums.size(); i++)
            {
                sum += nums[i];
                size++;
                if (sum >= target)
                {
                    if (subsize == 0) subsize = size;
                    else if (size < subsize)
                    {
                        subsize = size;
                    }
                    size = 0;
                    sum = 0;
                }
            }
            size = 0;
            sum = 0;
        }
        return subsize;
    } 
};
int main()
{
    vector<int> my_nums = { 1,2,3,4,5};
    int target = 15;
    Solution a;
    cout << a.minSubArrayLen(target , my_nums);
  return 0;
}


暴力解法

和自己写的原理类似,都是超时

#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int result = INT32_MAX; // 最终的结果
        int sum = 0; // 子序列的数值之和
        int subLength = 0; // 子序列的长度
        for (int i = 0; i < nums.size(); i++) { // 设置子序列起点为i
            sum = 0;
            for (int j = i; j < nums.size(); j++) { // 设置子序列终止位置为j
                sum += nums[j];
                if (sum >= s) { // 一旦发现子序列和超过了s,更新result
                    subLength = j - i + 1; // 取子序列的长度
                    result = result < subLength ? result : subLength;
                    break; // 因为我们是找符合条件最短的子序列,所以一旦符合条件就break
                }
            }
        }
        // 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
        return result == INT32_MAX ? 0 : result;
    }
};
int main()
{
    vector<int> my_nums = { 2,3,1,2,4,3 };
    int target = 7;
    Solution a;
    cout << a.minSubArrayLen(target , my_nums);
  return 0;
}


滑动窗口 (双指针)

#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int i = 0, sum = 0, length = 0, result = INT32_MAX;
        for (int j = 0; j < nums.size(); j++)
        {
            sum += nums[j];
            while (sum >= target)
            {
                length = j - i + 1;
                result = result < length ? result : length;
                sum -= nums[i++];
            }
        }
        return result ==INT32_MAX ? 0:result;
    }
};
int main()
{
    vector<int> my_nums = { 2,3,1,2,4,3 };
    int target = 7;
    Solution a;
    cout << a.minSubArrayLen(target , my_nums);
  return 0;
}


二刷

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int result=INT_MAX ,sum=nums[0];
        int left=0,right=0;
        for(right=0 ; right<nums.size() && left<=right;)
        {
            if( sum >= target )
            {
                if( right-left+1 <= result) result = right-left+1 ;
                cout<<left<<' '<<right<<' '<<sum<<endl;
                sum -=  nums[left];
                left++;
            }else
            {
                right++;
                if(right>=nums.size()) break;
                sum += nums[right];
            }
        }
        if(result == INT_MAX) return 0;
        return result;
    }
};


相关文章
|
4月前
|
算法 Python
【Leetcode刷题Python】子数组查找
一个用于寻找给定字符串中最长重复子串的Python函数实现,采用了滑动窗口的方法来检测重复的子串。
22 1
|
4月前
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
44 0
|
6月前
|
算法 测试技术 程序员
力扣经典150题第三十题:长度最小的子数组
力扣经典150题第三十题:长度最小的子数组
32 1
|
6月前
|
存储
力扣-2904最短且字典序最小的美丽子序列
力扣-2904最短且字典序最小的美丽子序列
41 1
|
5月前
|
存储 算法
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
技术经验解读:【LeetCode】560.SubarraySumEqualsK子数组和为K
技术经验解读:【LeetCode】560.SubarraySumEqualsK子数组和为K
|
7月前
|
人工智能
力扣100114. 元素和最小的山形三元组 II(中等)
力扣100114. 元素和最小的山形三元组 II(中等)
|
6月前
【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串
【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串
|
7月前
|
索引
leetcode代码记录(最长重复子数组
leetcode代码记录(最长重复子数组
45 0
|
7月前
leetcode代码记录(长度最小的子数组
leetcode代码记录(长度最小的子数组
36 0