力扣刷题篇——滑动窗口

简介: 力扣刷题篇——滑动窗口

1984 题目描述✨:


给你一个 下标从 0 开始 的整数数组 nums ,其中 nums[i] 表示第 i 名学生的分数。另给你一个整数 k 。


从数组中选出任意 k 名学生的分数,使这 k 个分数间 最高分 和 最低分 的 差值 达到 最小化 。


返回可能的 最小差值 。


示例 1:

输入:nums = [90], k = 1

输出:0

解释:选出 1 名学生的分数,仅有 1 种方法:

- [90] 最高分和最低分之间的差值是 90 - 90 = 0

可能的最小差值是 0


示例 2:

输入:nums = [9,4,1,7], k = 2

输出:2

解释:选出 2 名学生的分数,有 6 种方法:

- [9,4,1,7] 最高分和最低分之间的差值是 9 - 4 = 5

- [9,4,1,7] 最高分和最低分之间的差值是 9 - 1 = 8

- [9,4,1,7] 最高分和最低分之间的差值是 9 - 7 = 2

- [9,4,1,7] 最高分和最低分之间的差值是 4 - 1 = 3

- [9,4,1,7] 最高分和最低分之间的差值是 7 - 4 = 3

- [9,4,1,7] 最高分和最低分之间的差值是 7 - 1 = 6

可能的最小差值是 2


解题思路✨:

这道题可以用滑动窗口来解决


设定两个滑动窗口 i 和 j i代表左区间 j 代表右区间

开始为空窗口  i=0 ,j=-1

先移动右窗口当不满足条件就移动左窗口直到窗口的长度为k时 返回所有窗口中的最小值就是我们要的答案了

代码附上✨:

class Solution {
    public int minimumDifference(int[] nums, int k) {
        Arrays.sort(nums);
            int n=nums.length;
            int i=0;
            int j=-1;
            int ans=100001;
           while(j<n-1){
               j++;
               while(j-i+1>k){
                   i++;
               }
               if(j-i+1==k){
                   ans=Math.min(ans,nums[j]-nums[i]);
               }
           }
           return ans;
    }
}

2269题目描述✨:


一个整数 num 的 k 美丽值定义为 num 中符合以下条件的 子字符串 数目:


子字符串长度为 k 。

子字符串能整除 num 。

给你整数 num 和 k ,请你返回 num 的 k 美丽值。


注意:


允许有 前缀 0 。

0 不能整除任何值。

一个 子字符串 是一个字符串里的连续一段字符序列。


示例 1:

输入:num = 240, k = 2

输出:2

解释:以下是 num 里长度为 k 的子字符串:

- "240" 中的 "24" :24 能整除 240 。

- "240" 中的 "40" :40 能整除 240 。

所以,k 美丽值为 2 。


示例 2:

输入:num = 430043, k = 2

输出:2

解释:以下是 num 里长度为 k 的子字符串:

- "430043" 中的 "43" :43 能整除 430043 。

- "430043" 中的 "30" :30 不能整除 430043 。

- "430043" 中的 "00" :0 不能整除 430043 。

- "430043" 中的 "04" :4 不能整除 430043 。

- "430043" 中的 "43" :43 能整除 430043 。

所以,k 美丽值为 2 。


解题思路✨:

这道题直接正常模拟就行 判断非0是否整除


代码附上:

class Solution {
    public int divisorSubstrings(int num, int k) {
        int count=0;
        String str=String.valueOf(num); //将整型转化为字符串
        for(int i=0;i<str.length()-k+1;i++){
            int t=Integer.parseInt(str.substring(i,i+k));//将字符串转化为整数
                if(t==0){
                    continue;
                }else{
                    if(num%t==0){
                        count++;
                    }
                }
        }
        return count;
    }
}

1763题目描述✨:


当一个字符串 s 包含的每一种字母的大写和小写形式 同时 出现在 s 中,就称这个字符串 s 是 美好 字符串。比方说,"abABB" 是美好字符串,因为 'A' 和 'a' 同时出现了,且 'B' 和 'b' 也同时出现了。然而,"abA" 不是美好字符串因为 'b' 出现了,而 'B' 没有出现。


给你一个字符串 s ,请你返回 s 最长的 美好子字符串 。如果有多个答案,请你返回 最早 出现的一个。如果不存在美好子字符串,请你返回一个空字符串。


示例 1:

输入:s = "YazaAay"

输出:"aAa"

解释:"aAa" 是一个美好字符串,因为这个子串中仅含一种字母,其小写形式 'a' 和大写形式 'A' 也同时出现了。

"aAa" 是最长的美好子字符串。


示例 2:

输入:s = "Bb"

输出:"Bb"

解释:"Bb" 是美好字符串,因为 'B' 和 'b' 都出现了。整个字符串也是原字符串的子字符串。


示例 3:

输入:s = "c"

输出:""

解释:没有美好子字符串。


示例 4:

输入:s = "dDzeE"

输出:"dD"

解释:"dD" 和 "eE" 都是最长美好子字符串。

由于有多个美好子字符串,返回 "dD" ,因为它出现得最早。


解题思路✨:

枚举:


根据题意可知,美好字符串的定义是:每一种字母的大写和小写形式 同时 出现在 s 中,就称这个字符串 s 是 美好 字符串

由于英文字母‘a’−‘z’ 最多只有 26 个, 因此可以利用二进制位来进行标记,a标记字符中出现过小写英文字母,b标记字符中出现过大写英文字母


如果满足 a=b ,我们则认为字符串中所有的字符都满足大小写形式同时出现,则认定该字符串为美好字符串。


题目要求如果出现多个美好字符串,返回最早出现的


我们首先需要检测出以字符串索引为0起始的子字符串


代码附上✨:  

class Solution {
    public String longestNiceSubstring(String s) {
        int n = s.length();
        int index = -1, len = 0;
        for (int i = 0; i < n; i++) {
            int a = 0, b = 0;
            for (int j = i; j < n; j++) {
                char c = s.charAt(j);
                if (c >= 'a' && c <= 'z') a |= (1 << (c - 'a'));
                else b |= (1 << (c - 'A'));
                if (a == b && j - i + 1 > len) {
                    index = i; len = j - i + 1;
                }
            }
        }
        return index == -1 ? "" : s.substring(index, index + len);
    }
}


以上就是小王同学带给大家的关于滑动窗口的题目

相关文章
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
29天前
【LeetCode 26】239.滑动窗口最大值
【LeetCode 26】239.滑动窗口最大值
30 1
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
54 6
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
46 4
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
107 2
|
9天前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
11 1
|
2月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
30天前
【LeetCode 04】滑动窗口法总结
【LeetCode 04】滑动窗口法总结
15 0
|
3月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
54 7
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
25 4