滑动窗口

本文介绍了滑动窗口算法在解决LeetCode两个问题中的应用:209.长度最小的子数组和剑指OfferⅡ016.不含重复字符的最长子字符串。通过固定窗口一端,遍历另一端,找到满足条件的最小子数组长度以及最长无重复字符子字符串的长度。这两个问题都展示了滑动窗口在数组和字符串处理中的高效性。
摘要由CSDN通过智能技术生成

滑动窗口

固定滑动窗口的一端,遍历另一端。

LeetCode209. 长度最小的子数组

题目描述:给定一个含有 n 个正整数的数组和一个正整数 target 。

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

链接:https://leetcode.cn/problems/minimum-size-subarray-sum

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        //滑动窗口
        //遍历滑动窗口的结束位置,每次更新起始位置(在while中同时更新起始与结束位置容易出错)
        int left = 0;
        int ans = INT_MAX;
        int sum = 0;
        for (int right = 0; right < nums.size(); right++) {
            sum += nums[right];
            while (sum >= target) {    //如果当前和大于target,则左移起始位置
                ans = ans < right - left + 1 ? ans : right - left + 1;
                sum -= nums[left];
                left++;
            }
        }
        return ans == INT_MAX ? 0 : ans;
    }
};

剑指Offer Ⅱ 016. 不含重复字符的最长子字符串

题目描述:给定一个字符串 s ,请你找出其中不含有重复字符的 最长连续子字符串 的长度。

链接:https://leetcode.cn/problems/wtcaE1

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        //滑动窗口
        int maxLength = 0;
        int right = 1;
        unordered_set<char> st;
        st.insert(s[0]);
        for (int left = 0; left < s.size(); left++) {
            if (left != 0) st.erase(s[left - 1]);
            while (right < s.size() && st.find(s[right]) == st.end()) {
                st.insert(s[right]);
                right++;
            }
            maxLength = maxLength > right - left ? maxLength : right - left;
        }
        return maxLength;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值