【算法挨揍日记】day05——209. 长度最小的子数组、3. 无重复字符的最长子串

简介: 题目描述: 给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

209. 长度最小的子数组

209. 长度最小的子数组

题目描述:

给定一个含有 n 个正整数的数组和一个正整数 target

找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组[numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0

解题思路:

我们通过题目得知,本题是一个正数数列,题目要求求出最小连续子数组,假设子数组之和为sum

假设从左到右,我们每加一个数,sum都是增大,每减一个数,sum都是减小,这就是具有单调性

所以我们可以用两个指针left和right(一开始都是在0的位置)来当做窗口的左右边界,当right向右移动的时候,sum为这个窗口之和,当right向右,sum递增,当left向右,sum递减(当双指针运动方向相同的时候称为同向双指针),当sum>=target,出窗口(left++),否则进窗口(right++),还需要更新length(最小长度)。

时间复杂度:虽然代码是两层循环,但是我们的 left 指针和 right 指针都是不回退的,两者

最多都往后移动 n 次。因此时间复杂度是 O(N)

解题代码:

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int length = INT_MAX;
        int n = nums.size();
        int left = 0;
        int right = 0;
        int sum = 0;
        while(right<n)
        {
            sum+=nums[right];
            while(sum>=target)
            {
                length=min(length,right-left+1);
                sum-=nums[left++];
            }
            right++;
        }
        return length==INT_MAX?0:length;
    }
};

3. 无重复字符的最长子串

题目描述:

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

解题思路:

依旧是利用滑动窗口

解题代码:

class Solution {
public:
    bool str(string&s,int left,int right,char ch)
    {
        for(int i=left;i<=right;i++)
        {
            if(ch==s[i])
            return false;
        }
        return true;
    }
    int lengthOfLongestSubstring(string s) {
        int length=0;
        int left=0,right=0;
        int n=s.size();
        while(right<n)
        {
            while(!str(s,left,right-1,s[right]))
                left++;
            length=max(length,right-left+1);
            right++;
        }
        return length;
    }
};



相关文章
|
5天前
|
算法
【算法】位运算算法——判断字符是否唯一
【算法】位运算算法——判断字符是否唯一
|
5天前
|
算法
【算法】滑动窗口——无重复字符的最长子串
【算法】滑动窗口——无重复字符的最长子串
|
5天前
|
算法
【算法】滑动窗口——长度最小的子数组
【算法】滑动窗口——长度最小的子数组
|
5天前
|
算法 C++
【算法】前缀和算法——和可被K整除的子数组
【算法】前缀和算法——和可被K整除的子数组
|
5天前
|
算法
【算法】前缀和算法——和为k的子数组之和
【算法】前缀和算法——和为k的子数组之和
|
11天前
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
22 0
|
2月前
|
机器学习/深度学习 算法 测试技术
【算法优选】 动态规划之子数组、子串系列——壹
【算法优选】 动态规划之子数组、子串系列——壹
|
3月前
|
算法 C++
【优选算法】——滑动窗口——3. 无重复字符的最长子串
【优选算法】——滑动窗口——3. 无重复字符的最长子串
|
2月前
|
算法
数据结构和算法——散列函数的构造方法(直接定址法、除留余数法、数字分析法、折叠法、平方取中法、ASCII码加和法、前三字符移位法)
数据结构和算法——散列函数的构造方法(直接定址法、除留余数法、数字分析法、折叠法、平方取中法、ASCII码加和法、前三字符移位法)
27 0
|
2月前
|
人工智能 算法
【算法优选】 动态规划之子数组、子串系列——贰
【算法优选】 动态规划之子数组、子串系列——贰

热门文章

最新文章