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;
    }
};
相关推荐
lvwangshu1 小时前
笛卡尔树
算法·图论
026d231 小时前
状态信号只知“其然”不知“其所以然”:变工况机械故障诊断的物理盲区
算法
姜鱼问生2 小时前
备份和服务器在同一台机器上,等于没备份
算法·架构
姜鱼问生2 小时前
别再 chmod 777 了,用 ACL 给它开一扇窗
后端·算法·架构
特立独行的猫a2 小时前
仓颉语言UI开发实战:我用仓颉写了个桌面版力扣
算法·leetcode·ui·tauri·仓颉·cj-tarui
y1su2 小时前
Leetcode 动态规划 模板
java·数据结构·算法·leetcode·动态规划
All for pursuit.3 小时前
【位运算-3】136.只出现一次的数字
数据结构·c++·算法·leetcode
MoRanzhi12033 小时前
106.正则问题(分治)
python·算法·正则表达式·蓝桥杯·递归·分治算法·字符串处理
suhan4 小时前
【数据结构】五、树:7.哈夫曼树、哈夫曼编码
数据结构·算法·排序算法