DAY2 滑动窗口

209. 长度最小的子数组

题目

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

找出该数组中满足其总和大于等于** target** 的长度最小的 子数组 [nums_(l), nums_(l+1), ..., nums_(r-1), nums_(r)] ,并返回其长度**。** 如果不存在符合条件的子数组,返回 0 。

示例 1:

复制代码
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

示例 2:

复制代码
输入:target = 4, nums = [1,4,4]
输出:1

示例 3:

复制代码
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

提示:

  • 1 <= target <= 10^(9)

  • 1 <= nums.length <= 10^(5)

  • 1 <= nums[i] <= 10^(4)

进阶:

  • 如果你已经实现**O(n) 时间复杂度的解法, 请尝试设计一个 O(n log(n)) 时间复杂度的解法。

当前编辑器代码

复制代码
/*
滑动窗口的核心要点:
1.维护一个有条件的滑动窗口;
2.右端点右移,导致窗口扩大,不满足条件;
3.左端点右移,缩小窗口,重新满足条件
时间复杂度o(n)
空间复杂度o(1)
*/
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int n=nums.size();
        int l=0,r=0;
        int s=0;
        int ans=0x3f3f3f3f;
        for(int r=0;r<n;r++){
            s+=nums[r];
            // while(s>=target){
            //     ans=min(ans,r-l+1);
            //     s-=nums[l];
            //     l++;
            // }
            while(s-nums[l]>=target){
                s-=nums[l];
                l++;
            }
            if(s>=target)ans=min(ans,r-l+1);
        }
        return ans>n?0:ans;
    }
};

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

题目

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

示例 1:

复制代码
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。注意 "bca" 和 "cab" 也是正确答案。

示例 2:

复制代码
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

复制代码
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

提示:

  • 0 <= s.length <= 10^(5)

  • s 由英文字母、数字、符号和空格组成

当前编辑器代码

复制代码
/*
时间复杂度o(n)
空间复杂度o(128) o(1) o(len(set(s)))
*/
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int l=0,r=0,n=s.size();
        int ans=0;
        unordered_map<char,int> win;
        for(int r=0;r<n;r++){
            char c=s[r];
            win[c]++;
            while(win[c]>1){
                win[s[l]]--;
                l++;
            }
            ans=max(ans,r-l+1);
        }
        return ans;
    }
};

713. 乘积小于 K 的子数组

题目

给定一个整数数组 nums 和一个整数 k。

请你返回 子数组 内所有元素的 乘积严格小于** k 的连续子数组的数目。

示例 1:

复制代码
输入:nums = [10,5,2,6], k = 100
输出:8
解释:8 个乘积小于 100 的子数组分别为:[10]、[5]、[2]、[6]、[10,5]、[5,2]、[2,6]、[5,2,6]。
需要注意的是 [10,5,2] 并不是乘积小于 100 的子数组。

示例 2:

复制代码
输入:nums = [1,2,3], k = 0
输出:0

提示:

  • 1 <= nums.length <= 3 * 10^(4)

  • 1 <= nums[i] <= 1000

  • 0 <= k <= 10^(6)

当前编辑器代码

复制代码
/*
时间复杂度o(n)
空间复杂度o(1)
*/
class Solution {
public:
    int numSubarrayProductLessThanK(vector<int>& nums, int k) {
        if(k<=1)return 0;
        int n=nums.size();
        int l=0,r=0;
        int ans=0;
        int pro=1;
        for(int r=0;r<n;r++){
            pro*=nums[r];
            while(pro>=k){
                pro/=nums[l];
                l++;
            }
            ans+=r-l+1;
        }
        return ans;
    }
};
相关推荐
其实防守也摸鱼14 小时前
个人学习 Pwn 思路:从基础到漏洞利用的进阶路径
大数据·前端·人工智能·chrome·算法·安全·网络安全
Nuanyt14 小时前
LeetCode Hot 100 链表专题(五)· 2 题(Java)
java·算法·leetcode·链表
w_zero_one17 小时前
递归算法(一)
java·开发语言·算法
圣保罗的大教堂18 小时前
leetcode 3736. 最小操作次数使数组元素相等 III 简单
leetcode
文丑颜不良啊18 小时前
LeetCode1881~1990题目解析
java·leetcode
风影同志7832419 小时前
20 个比特能装下多少行情?——实测拆解 Kronos 的 K 线分词器
算法
写的都是BUG19 小时前
APK 里的钥匙,一直就放在门口:聊聊加固真正该做什么
前端·算法
地平线开发者20 小时前
CLIP 的零样本分类:一组文本如何变成图像分类器?
算法
京东云开发者20 小时前
从“会生成”到“能生产”:萤火虫 AIGC 平台的 AI Infra 实践
算法·aigc·产品