首页 > 其他分享 >滑动窗口系列(不定长滑动窗口长度)9/4

滑动窗口系列(不定长滑动窗口长度)9/4

时间:2024-09-04 12:20:48浏览次数:12  
标签:count right 窗口 nums int 数组 滑动 left 不定

求子数组个数

一、乘积小于k的子数组

给你一个整数数组 nums 和一个整数 k ,请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目。

输入:nums = [10,5,2,6], k = 100
输出:8
解释:8 个乘积小于 100 的子数组分别为:[10]、[5]、[2]、[6]、[10,5]、[5,2]、[2,6]、[5,2,6]。
思路:

使用滑动窗口的思路,当右边界增大后,仍然满足条件的时候,此时增加的有效答案有:right-left+1.为什么呢?新增一个元素后,该元素和之前其他元素可以组成新的子数组,自己也可以作为子数组,所以有(right-left+1)个。

什么时候更新答案呢?当找到合适的left之后。

因为当更新右边界后,可能该滑动窗口不是满足条件的,所以在更新左边界之后,再计算有效的子数组。

代码:
class Solution {
    public int numSubarrayProductLessThanK(int[] nums, int k) {
        if(k<=1)return 0;
        int left=0;
        int right=0;
        int count=0;
        int multi=1;
        while(right<nums.length){
            multi*=nums[right];
            while(multi>=k){
                multi=multi/nums[left];
                left++;
            }
            if(multi<k)count+=right-left+1;
            right++;
        }
        return count;
    }
}

二、包含所有三种字符的子字符串数目

给你一个字符串 s ,它只包含三种字符 a, b 和 c 。

请你返回 a,b 和 c 都 至少 出现过一次的子字符串数目。

输入:s = "abcabc"
输出:10
解释:包含 a,b 和 c 各至少一次的子字符串为 "abc", "abca", "abcab", "abcabc", "bca", "bcab", "bcabc", "cab", "cabc"  "abc" (相同字符串算多次)
思路:

滑动窗口,只要找到第一个满足要求的子字符串,那么后面无论再加上什么,都是符合要求的。所以符合条件的字符串有s.length()-right;

那我们只需要找到满足要求的字符串,然后res+=s.length()-right;

            while(count[0]>=1&&count[1]>=1&&count[2]>=1){
                res+=s.length()-right;
                count[s.charAt(left)-'a']--;
                left++;
            }
代码:
class Solution {
    public int numberOfSubstrings(String s) {
        int[] count=new int[3];
        int left=0;
        int right=0;
        int res=0;
        while(right<s.length()){
            count[s.charAt(right)-'a']++;
            while(count[0]>=1&&count[1]>=1&&count[2]>=1){
                res+=s.length()-right;
                count[s.charAt(left)-'a']--;
                left++;
            }
            right++;
        }
        return res;
    }
}

三、模型(当题目中要求 出现xxx 至少xx次)

思路:

这种题我们首先要找到符合条件的滑动窗口,然后所有符合条件的结果就是 总长度-right 

 在寻找符合条件的滑动窗口的时候,用while。

class Solution {
    public int countKConstraintSubstrings(String s, int k) {
        int[] arr=new int[2];
        int left=0;
        int right=0;
        int count=0;
        while(right<s.length()){
            //积累条件
            xxx
            //只要满足题目中的条件 就可以加了
            while(题目中给定的条件){
                count+=s.length()-right;
                arr[s.charAt(left)-'0']--;
                left++;
            }
            right++;
        }
        return xxx
    }
}

四、统计完全子数组的数目
 

给你一个由  整数组成的数组 nums 。如果数组中的某个子数组满足下述条件,则称之为 完全子数组 :

  • 子数组中 不同 元素的数目等于整个数组不同元素的数目。

返回数组中 完全子数组 的数目。子数组 是数组中的一个连续非空序列。

输入:nums = [1,3,1,2,2]
输出:4
解释:完全子数组有:[1,3,1,2]、[1,3,1,2,2]、[3,1,2] 和 [3,1,2,2] 。
思路:

1.首先统计一下数组中数字的种类distinctCount以及数量。使用数组统计(因为题目中数字的大小是1-2000)

2.定义一个变量completeCount记录滑动窗口中数字的种类;定义一个数组统计滑动窗口中数字的数量

3.滑动窗口右边界停止扩大,开始收割结果的条件:completeCount==distinctCount (子数组中 不同 元素的数目等于整个数组不同元素的数目。)

然后开始收割:res+=nums.length-right; 然后左边界移动,移动的时候数量要改变,如果数量==0,种类也要改变。

代码:
class Solution {
    public int countCompleteSubarrays(int[] nums) {
        //1.统计字符的数量 以及 字符的种类
        int distinctCount =0;
        int[] count=new int[2001];
        for(int num:nums){
            count[num]++;
            if(count[num]==1)distinctCount++;
        }
        //2.
        int left=0;
        int right=0;
        int res=0;
        int completeCount=0;
        int[] window=new int[2001];
        while(right<nums.length){
            window[nums[right]]++;
            if(window[nums[right]]==1)completeCount++;
            //如果滑动窗口中的种类==总的种类
            while(completeCount==distinctCount){
                res+=nums.length-right;
                window[nums[left]]--;
                if(window[nums[left]]==0){
                    completeCount--;
                }
                left++;
            }
            right++;
        }
        return res;
    }
}

五、统计好子数组的数目

给你一个整数数组 nums 和一个整数 k ,请你返回 nums 中  子数组的数目。

一个子数组 arr 如果有 至少 k 对下标 (i, j) 满足 i < j 且 arr[i] == arr[j] ,那么称它是一个  子数组。子数组 是原数组中一段连续 非空 的元素序列。

思路:

子数组中至少有k对满足条件,那么他就是一个好子数组。

1.首先我们要统计滑动窗口中有多少对满足条件的(i,j);记为 typeCount;

if(map.get(nums[right])>=2)typeCount+=map.get(nums[right])-1;

新加一个相同的数字,它就可以和前面所有的组成一个符合条件的数对。

2.如果typeCount>=k,滑动窗口的右边界就固定住。res+=nums.length-right;(因为右边界如果满足,那么以后的也一定满足)。

3.然后改变左边界,首先改变在map哈希表中的数量,然后改变typeCount;

            while(typeCount>=k){
                res+=nums.length-right;
                int num=nums[left];
                map.put(nums[left],map.get(nums[left])-1);
                typeCount-=map.get(nums[left]);
                left++;
            }
代码:
class Solution {
    public long countGood(int[] nums, int k) {
        int typeCount=0;
        int left=0;
        int right=0;
        long res=0;
        Map<Integer,Integer> map=new HashMap<>();
        while(right<nums.length){
            map.put(nums[right],map.getOrDefault(nums[right],0)+1);
            if(map.get(nums[right])>=2)typeCount+=map.get(nums[right])-1;
            while(typeCount>=k){
                res+=nums.length-right;
                map.put(nums[left],map.get(nums[left])-1);
                typeCount-=map.get(nums[left]);
                left++;
            }
            right++;
        }
        return res;
    }
}

 

标签:count,right,窗口,nums,int,数组,滑动,left,不定
From: https://blog.csdn.net/2301_78191305/article/details/141882987

相关文章

  • 算法练习题10:leetcode76最小覆盖子串-滑动窗口
    目录题目题目描述约束条件解决思路代码getOrDefault(c,0) 方法方法签名参数返回值示例getOrDefault 与 get 的主要区别Integer 题目题目描述给定两个字符串s和t,请你在字符串s中找到包含t中所有字符的最小子串。要求:        如果 s ......
  • Leetcode面试经典150题-239.滑动窗口最大值
    解法都在代码里,不懂就留言或者私信官方定级hard难度,其实是medium,确实字节考过classSolution{publicint[]maxSlidingWindow(int[]nums,intk){if(nums.length==1){returnnewint[]{nums[0]};}/**我们要返回的是一个......
  • Android经典实战之窗口和WindowManager
    本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点在Android开发中,“窗口”是一个非常基础且重要的概念。窗口通常用于承载和显示用户界面内容。了解窗口的工作机制,以及如何管理窗口,对于开发复杂的和用户体验良好的应用程序至......
  • 三、STM32F103标准库DMA+USART接收不定长数据
    项目中常用到串口通信,当需要使用串口中断接不定长数据时,可以参考以下示例:本实例使用DMA+USART空闲中断来进行不定长数据接受,在数据接收完成后将数据透传。结果将通过另一个串口信息显示。1、主函数配置#include"stm32f10x.h"#include"printfsupport.h"#include"usar......
  • 为代码块添加 Mac OS X 窗口样式
    为代码块添加MacOSX窗口样式为代码块添加MacOSX窗口样式,在代码块pre之前添加图片,在代码块pre之后添加文本。pre{padding:30px2px2px2px;line-height:1;overflow:auto;word-wrap:normal;border-radius:5px;}pre>code{mar......
  • 算法练习题09:滑动窗口最大值(队列、双端队列)
    classSolution{publicint[]maxSlidingWindow(int[]nums,intk){if(nums==null||nums.length==0){returnnewint[0];}intn=nums.length;int[]result=newint[n-k+1];Deque<Integer&......
  • 窗口录屏工具
    窗口录制工具的使用说明与详细介绍概述此脚本是一个基于Tkinter和OpenCV的简单窗口录制工具,允许用户录制当前屏幕的活动内容并保存为视频文件。用户可以通过图形界面(GUI)进行录制控制,并选择所需的帧率。个人博客个人博客直达地址网站不断完善中里面拥有大量的脚本,......
  • qt实现三原色滑动条变色
    在qt中有这样一个控件:就是这个HorizontalSlider他的作用相信大家都知道了,也就是通过滑动来改变数值。今天我们就使用这个控件实现一个三原色滑动变色。实现效果:1.创建UI界面 这个就不用多说了,这个大家就按照我的这个去创建就好了。2.编写代码首先我们要初始话我们的......
  • 滑动窗口系列(不定长滑动窗口长度) 9/2
    一、将x减到0的最小操作数给你一个整数数组 nums 和一个整数 x 。每一次操作时,你应当移除数组 nums 最左边或最右边的元素,然后从 x 中减去该元素的值。请注意,需要 修改 数组以供接下来的操作使用。如果可以将 x 恰好 减到 0 ,返回 最小操作数 ;否则,返回 -1......
  • C++中不定参数函数的实现方法
    目录一.前言二.代码解析1.模板方式第一种写法第二种写法2.va_list方式三.其他一.前言C++中实现不定参数函数可以采用多种方法,这篇文章讨论不定参数模板和va_list。二.代码解析1.模板方式C++中采用模板来实现不定参数列表,可以有多种编码的方法,这里提供两种方法。......