算法刷题——7.8

简介: ✨今日算法三题1.学生分数的最小差值2.乘积小于k的子数组3.考试的最大困扰度

✨今日算法三题


1.学生分数的最小差值

2.乘积小于k的子数组

3.考试的最大困扰度


文章目录


一、学生分数的最小差值


题目描述

思路详解


首先对数组nums 进行升序排序,随后使用一个大小固定为 k 的滑动窗口在nums 上进行遍历。记滑动窗口的左边界为i,那么右边界即为i+k−1,窗口中的 k 名学生最高分和最低分的差值即为 nums[i+k−1]−nums[i]。

因为已经排过序,最右边的减去最左边的就为最高分与最低分差值,窗口长度固定,矿口在数组上滑动找出最小值。


代码与结果

class Solution {
    public int minimumDifference(int[] nums, int k) {
        int n = nums.length;
        Arrays.sort(nums);
        int ans = Integer.MAX_VALUE;
        for (int i = 0; i + k - 1 < n; ++i) {
            ans = Math.min(ans, nums[i + k - 1] - nums[i]);
        }
        return ans;
    }
}

二、乘积小于k的子数组


题目描述

思路详解


我们利用滑动窗口,当我们固定右边界之后,随着左边界的右移,滑动窗口的元素就会越来越少,乘积越来越小,当左窗口右移到一定程度就不需要右移了,因为滑动窗口乘积值越右移越小嘛。

我们先遍历固定右边界,左边界第一次从0开始遍历,之后就可以从上一次的位置直接进行遍历了。


代码与结果

class Solution {
    public int numSubarrayProductLessThanK(int[] nums, int k) {
        int n = nums.length, ret = 0;
        int prod = 1, i = 0;
        for (int j = 0; j < n; j++) {
            prod *= nums[j];
            while (i <= j && prod >= k) {
                prod /= nums[i];
                i++;
            }
            ret += j - i + 1;
        }
        return ret;
    }
}

三、考试的最大困扰度


题目描述

思路详解


首先想到是就是 把每一种的字符的最大连续个数算出来取最大就可以。

使用滑动窗口的方法,从左到右枚举右端点,维护区间中另一种字符的数量为sum,当sum 超过 k,我们需要让左端点右移,直到sum≤k。移动过程中,我们记录滑动窗口的最大长度,即为指定字符的最大连续数目。


代码与结果

class Solution {
    public int maxConsecutiveAnswers(String answerKey, int k) {
        return Math.max(maxConsecutiveChar(answerKey, k, 'T'), maxConsecutiveChar(answerKey, k, 'F'));
    }
    public int maxConsecutiveChar(String answerKey, int k, char ch) {
        int n = answerKey.length();
        int ans = 0;
        for (int left = 0, right = 0, sum = 0; right < n; right++) {
            sum += answerKey.charAt(right) != ch ? 1 : 0;
            while (sum > k) {
                sum -= answerKey.charAt(left++) != ch ? 1 : 0;
            }
            ans = Math.max(ans, right - left + 1);
        }
        return ans;
    }
}


✨总结


今天的算法主要滑动窗口为主,滑动窗口用来求连续子序列很方便,还需要多练习。

来个三连吧,小伙伴们。


😎The man who fears losing has already lost.

怕输的人已经输了。 - 《权力的游戏》😎


相关文章
|
8月前
|
机器学习/深度学习 存储 算法
【算法沉淀】刷题笔记:并查集 带权并查集+实战讲解
【算法沉淀】刷题笔记:并查集 带权并查集+实战讲解
|
8月前
|
自然语言处理 算法
算法刷题(二十三):Bigram 分词
算法刷题(二十三):Bigram 分词
73 0
|
8月前
|
算法
算法刷题(二十二):宝石与石头
算法刷题(二十二):宝石与石头
78 0
|
7月前
|
存储 算法 C语言
【数据结构与算法 刷题系列】合并两个有序链表
【数据结构与算法 刷题系列】合并两个有序链表
|
3月前
|
数据可视化 搜索推荐 Python
Leecode 刷题笔记之可视化六大排序算法:冒泡、快速、归并、插入、选择、桶排序
这篇文章是关于LeetCode刷题笔记,主要介绍了六大排序算法(冒泡、快速、归并、插入、选择、桶排序)的Python实现及其可视化过程。
25 0
|
5月前
【刷题记录】最大公因数,最小公倍数(辗转相除法、欧几里得算法)
【刷题记录】最大公因数,最小公倍数(辗转相除法、欧几里得算法)
|
5月前
|
算法 Python
【Leetcode刷题Python】改进的算法,高效求一个数的因子
一个高效的Python函数用于找出一个整数的所有因子,通过仅遍历到该数平方根的范围来优化性能。
51 0
|
7月前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
7月前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-1
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
7月前
|
算法
【数据结构与算法 刷题系列】求带环链表的入环节点(图文详解)
【数据结构与算法 刷题系列】求带环链表的入环节点(图文详解)

热门文章

最新文章