栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

0708刷题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

0708刷题

排序

https://leetcode.cn/problems/minimum-difference-between-highest-and-lowest-of-k-scores/

题目

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

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

返回可能的 最小差值 。

思路

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

代码
import java.util.Arrays;

class Solution {
  public int minimumDifference(int[] nums, int k) {
    Arrays.sort(nums);
    int n = nums.length;
    int ans = nums[k - 1] - nums[0];
    for (int i = k; i < n; i++) {
      ans = Math.min(ans, nums[i] - nums[i - k + 1]);
    }
    return ans;
  }
}
乘积小于k的子数组 题目

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

  • 示例 1:

​ 输入:nums = [10,5,2,6], k = 100
​ 输出:8
​ 解释:

​ 8 个乘积小于 100 的子数组分别为:[10]、[5]、[2],、[6]、[10,5]、[5,2]、[2,6]、[5,2,6]。
​ 需要注意的是 [10,5,2] 并不是乘积小于 100 的子数组。

思路

用固定长度滑块法。

代码
class Solution {
  public int numSubarrayProductLessThanK(int[] nums, int k) {
    //同样排除k为1的情况比如  [1,1,1] k=1
    if (k <= 1) {
      return 0;
    }
    int left = 0;
    int right = 0;
    //创建一个变量记录路上的乘积
    int mul = 1;
    //记录连续数组的组合个数
    int ans = 0;

    //用右指针遍历整个数组,每次循环右指针右移一次
    while(right
      //记录乘积
      mul *= nums[right];
      //当大于等于k,左指针右移并把之前左指针的数除掉
      while (mul >= k) {
        mul /= nums[left];
        left++;
      }

      //每次右指针位移到一个新位置,应该加上 x 种数组组合:
      //  nums[right]
      //  nums[right-1], nums[right]
      //  nums[right-2], nums[right-1], nums[right]
      //  nums[left], ......, nums[right-2], nums[right-1], nums[right]
      //共有 right - left + 1 种
      ans += right - left + 1;

      //右指针右移
      right++;
    }
    return ans;
  }
}

考试的最大困扰度 题目

一位老师正在出一场由 n 道判断题构成的考试,每道题的答案为 true (用 ‘T’ 表示)或者 false (用 ‘F’ 表示)。老师想增加学生对自己做出答案的不确定性,方法是 最大化 有 连续相同 结果的题数。(也就是连续出现 true 或者连续出现 false)。

给你一个字符串 answerKey ,其中 answerKey[i] 是第 i 个问题的正确结果。除此以外,还给你一个整数 k ,表示你能进行以下操作的最多次数:

每次操作中,将问题的正确答案改为 ‘T’ 或者 ‘F’ (也就是将 answerKey[i] 改为 ‘T’ 或者 ‘F’ )。
请你返回在不超过 k 次操作的情况下,最大 连续 ‘T’ 或者 ‘F’ 的数目。

  • 示例 1:

​ 输入:answerKey = “TTFF”, k = 2
​ 输出:4
​ 解释:我们可以将两个 ‘F’ 都变为 ‘T’ ,得到 answerKey = “TTTT” 。
​ 总共有四个连续的 ‘T’ 。

思路

滑动窗口法

代码
class Solution3 {
  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;
  }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1008704.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号