滑动窗口(同向)同向双指针 leetcode713 3 1004 1234

这篇具有很好参考价值的文章主要介绍了滑动窗口(同向)同向双指针 leetcode713 3 1004 1234。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

同向双指针的理解

  • 双指针从同一侧开始走
  • 一般是right进行无脑遍历,left控制边界(导致模板化)
  • 深刻理解题目概念以及**(right - left +1)** 的含义
  • 多思考画图

模板

class Solution {
public:
    int numSubarrayProductLessThanK(vector<int>& nums, int k) {
        int count = 0;
        int left = 0;
        for(int right=0; right<nums.size(); right++)
        {
            while() // 条件自己加
            {
            }
            count += right - left + 1;
        }
        return count;
    }
};

具体还是要以题目为例

leetcode 713

滑动窗口(同向)同向双指针 leetcode713 3 1004 1234
滑动窗口(同向)同向双指针 leetcode713 3 1004 1234
几个关键点

  • 是正整数组
  • 要找连续子数组(同向双指针)

代码示例

完全模板化编程

class Solution {
public:
    int numSubarrayProductLessThanK(vector<int>& nums, int k) {
        int count = 0;
        int left = 0;
        int mul = 1;
        for(int right=0; right<nums.size(); right++)
        {
            mul *=nums[right];
            while(left<=right && mul>=k)
            {
                mul /= nums[left++];
            }
            count += right - left + 1;
        }
        return count;
    }
};

leetcode 3

滑动窗口(同向)同向双指针 leetcode713 3 1004 1234
几个关键点

  • 子串即连续子数组(同向双指针)
  • 不含有重复字符(letf与right中间的子串一定是不含有重复字母的)

代码示例

还是模板化的

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int left = 0;
        int max_size = 0;
        unordered_map<char, int> tmap;
        for(int right=0; right<s.size(); right++)
        {
            tmap[s[right]]++;
            while(tmap[s[right]]>1)
            {
                tmap[s[left]]--;
                left++;
            }
            max_size = max_size < right - left+1 ? right-left+1 : max_size;
        }
        return max_size;
    }
};

leetcode 1004

滑动窗口(同向)同向双指针 leetcode713 3 1004 1234
几个关键点

  • 返回连续1的个数 即也是一个子串问题
  • 滑动窗口之中永远是满足条件的1的个数

代码示例

class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        int left = 0;
        int count = 0;
        int res = 0;
        for(int right=0; right<nums.size(); right++)
        {
            count += 1 - nums[right];
            while(count > k)
            {
                count -= 1 - nums[left];
                left++;
            }
            res  = res > right - left + 1 ? res : right - left + 1;
        }
        return res;
    }
};

leetcode 1234

滑动窗口(同向)同向双指针 leetcode713 3 1004 1234
这道题核心我觉得是看清题目的意思
几个关键点文章来源地址https://www.toymoban.com/news/detail-417358.html

  • 是用替换子串的方式进行变换(子串即同向双指针)
  • 滑动窗口之外的各个字符数量<=m的话就可以通过替换(窗口内有>m的就不能替换)
  • 不断更新最小值即可

代码示例

class Solution {
public:
    int balancedString(string s) {
        int n = s.length();
        int m = n / 4;
        unordered_map<char, int> tmap;
        for(int i=0; i<s.size(); i++)
        {
            ++tmap[s[i]];
        }
        if (tmap['Q'] == m && tmap['W'] == m && tmap['E'] == m && tmap['R'] == m)
            return 0; 
        int res = n, left = 0;
        for (int right = 0; right < n; right++) { // 枚举子串右端点
            --tmap[s[right]];
            // 判断窗口外的情况
            while (tmap['Q'] <= m && tmap['W'] <= m && tmap['E'] <= m && tmap['R'] <= m) {
                res = min(res, right - left + 1);
                ++tmap[s[left++]]; // 缩小子串
            }
        }
        return res;
    }
};

到了这里,关于滑动窗口(同向)同向双指针 leetcode713 3 1004 1234的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 刷题(双指针思想/滑动窗口思想/l螺旋矩阵)

    刚开始自己做就是无脑ac的,sort: 但是时间复杂度有问题, 是O(nlogn)的时间复杂度 提升:用双指针的思想:时间复杂度为O(n) 使用 双指针 的思想解决本题的思路: 以数组 为例: 输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 因为输入的数组是递增的,因此,平方后的最大值,只

    2023年04月08日
    浏览(40)
  • 【map】【滑动窗口】【优先队列】LeetCode480滑动窗口中位数

    动态规划 多源路径 字典树 LeetCode2977:转换字符串的最小成本 C++算法:滑动窗口总结 map 优先队列 中位数是有序序列最中间的那个数。如果序列的长度是偶数,则没有最中间的数;此时中位数是最中间的两个数的平均数。 例如: [2,3,4],中位数是 3 [2,3],中位数是 (2 + 3) / 2 =

    2024年02月03日
    浏览(30)
  • 【leetcode C++】滑动窗口

    给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度 。 如果不存在符合条件的子数组,返回 0 。 . - 力扣(LeetCode) 画图 和 文字 分析 先说说有关滑动窗口的知识 滑动窗

    2024年04月09日
    浏览(27)
  • leetcode:滑动窗口

    目录 1.定长滑动窗口 1.1 几乎唯一子数组的最大和(使用map来计数) 1.2 长度为k子数组中的最大和 2.不定长滑动窗口 2.1 最多k个重复元素的最长子数组 2.2 绝对差不超过限制的最长连续子数组(multiset) 2.3 将x减到0的最小操作数(正难则反 逆向思维) 2.4 统计最大元素出现至少k次的

    2024年02月02日
    浏览(27)
  • leetcode—滑动窗口

    给定一个字符串  s  ,请你找出其中不含有重复字符的  最长子串  的长度。 示例 1: 滑动窗口 使用两个指针 表示字符串中某个子串的左右边界【i, right】 在每一步的操作中,将左指针i 向右移动一位,表示开始枚举下一个字符作为起始位置,然后不断的向右移动右指针(

    2024年01月17日
    浏览(34)
  • 【剑指offer刷题记录 java版】数组双指针 之 滑动窗口

    本系列文章记录labuladong的算法小抄中剑指offer题目 题目链接:https://leetcode.cn/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/ 题目链接:https://leetcode.cn/problems/MPnaiL/ 题目链接:https://leetcode.cn/problems/VabMRr/ 题目链接:https://leetcode.cn/problems/wtcaE1/ 题目链接:https://leetcode.cn/pr

    2024年02月09日
    浏览(43)
  • 【LeetCode 算法专题突破】滑动窗口(⭐)

    学完了双指针算法,滑动窗口那肯定是逃不掉了,我个人感觉他俩就不分家,不把滑动窗口的题目好好刷上一刷我都难受 先来一道经典的滑动窗口试试水 题目链接:209. 长度最小的子数组 其实滑动窗口题目的解法都大同小异,我们基本上写几道题目,就能很好的掌握这个算

    2024年02月07日
    浏览(40)
  • 考研算法35天:三元组的最小距离 【双指针,滑动窗口,多路归并】

    多路归并;多路归并算法从理论到应用(易懂)_留恋单行路的博客-CSDN博客 多路归并就是将多个已经归并排序排好序的数组再进行排序(不一定是通过归并排序)。 这道题就是一般做法是先通过排序将三个数组排好然后再进行三指针求最小。但是我们仔细考虑一下,如果我们先

    2024年02月12日
    浏览(27)
  • leetcode-239-滑动窗口最大值

    题意描述: 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例: 输入:nums = [1,3,-1,-3,5,3,6,7], k = 3 输出:[3,3,5,5,6,7] 解释: 滑动

    2024年02月07日
    浏览(37)
  • LeetCode239.滑动窗口最大值

    看到这道题我就有印象, 我在剑指offer里面做过这道题,我记得当时用的是优先队列,然后我脑子里一下子就有了想法,拿优先队列作为窗口,每往右移动一步,把左边的数remove掉,把右边的数add进来,然后把队头,也就是窗口中最大的元素放入答案数组,然后就写出了如下

    2024年02月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包