力扣刷题篇——滑动窗口

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

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);
    }
}


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

相关文章
|
1月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
41 6
|
1月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
35 4
|
1月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
73 2
|
1月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
36 7
|
1月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
17 4
|
1月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
40 5
|
1月前
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
36 3
|
1月前
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
15 3
|
1月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - II. 从上到下打印二叉树 II
本文提供了一种Python实现方法,用于层次遍历二叉树并按层打印结果,每层节点按从左到右的顺序排列,每层打印到一行。
28 3
|
1月前
|
Python
【Leetcode刷题Python】剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
Leetcode题目"剑指 Offer 21. 调整数组顺序使奇数位于偶数前面"的两种Python解决方案,一种是使用双端队列调整数组顺序,另一种是使用双指针法将奇数移到数组前半部分,偶数移到后半部分。
21 4