ZBLOG

滑动窗口算法对于最长或者最短子数组的原理及其c++例子

滑动窗口算法是一种用于解决子串或子数组问题的算法,其基本原理是通过维护一个滑动窗口来计算最长或最短的子串或子数组。

对于最长子数组问题,可以通过以下步骤实现:

  1. 定义两个指针left和right,分别表示滑动窗口的左右边界。

  2. 初始化left和right指针的位置,并记录当前最长子数组的长度。

  3. 移动right指针,直到滑动窗口内的元素满足条件。如果不满足条件,则移动left指针,并更新当前最长子数组的长度。

  4. 重复步骤3,直到right指针走到数组末尾。

以下是一个示例代码,通过滑动窗口算法求解一个数组中最长连续递增子序列的长度:

int findLengthOfLCIS(vector<int>& nums) {
    int n = nums.size();
    if(n <= 1) return n;
    int left = 0, right = 1, maxLen = 1;
    while(right < n) {
        if(nums[right] > nums[right - 1]) { // 满足递增条件
            maxLen = max(maxLen, right - left + 1);
        } else {
            left = right; // 更新left指针的位置
        }
        ++right; // 更新right指针的位置
    }
    return maxLen;
}

对于最短子数组问题,可以通过以下步骤实现:

  1. 定义两个指针left和right,分别表示滑动窗口的左右边界。

  2. 初始化left和right指针的位置,并记录当前最短子数组的长度。

  3. 移动right指针,直到滑动窗口内的元素满足条件。如果不满足条件,则移动left指针,并更新当前最短子数组的长度。

  4. 重复步骤3,直到right指针走到数组末尾。

以下是一个示例代码,通过滑动窗口算法求解一个数组中和大于等于给定值的最短子数组的长度:

int minSubArrayLen(int s, vector<int>& nums) {
    int n = nums.size();
    if(n == 0) return 0;
    int left = 0, right = 0, sum = 0, minLen = INT_MAX;
    while(right < n) {
        sum += nums[right]; // 累加元素
        while(sum >= s) { // 满足条件
            minLen = min(minLen, right - left + 1);
            sum -= nums[left++]; // 移动left指针
        }
        ++right; // 更新right指针的位置
    }
    return minLen == INT_MAX ? 0 : minLen;
}

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=165

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?