力扣 第 134 场双周赛 解题报告 | 珂学家


前言

image.png


题解

T1/T3是环形的处理技巧,这边可以double数组(更准确地讲,添加一个合适的小尾巴).
T4是典题,前不久周赛刚考过,是一道结论题,也可以借助数据结构处理。


T1. 交替组 I

和T3一起讲


T2. 与敌人战斗后的最大分数

题型: 阅读理解题

思路: 贪心

  • 最小代价得分,那就永远取最小的
  • 能量最大化,获取非最小值的所有能量

有解的前提,需要保证

初始能量 ≥ 最小值 初始能量 \ge 最小值 初始能量最小值

class Solution {public long maximumPoints(int[] es, int v) {  long s = Arrays.stream(es).mapToLong(Long::valueOf).sum();int m = Arrays.stream(es).min().getAsInt();if (v < m) return 0;return (s - m + v) / m;  }
}
class Solution:def maximumPoints(self, enemyEnergies: List[int], currentEnergy: int) -> int:s, m = sum(enemyEnergies), min(enemyEnergies)if currentEnergy < m:return 0return (s - m + currentEnergy) // m

T3. 交替组 II

环形的处理技巧之一

  • 扩充原有的数组

原数组添加前 k − 1 项到尾部 原数组添加前k-1项到尾部 原数组添加前k1项到尾部

剩下的事情就容易处理了

  • 枚举右端点
  • 状态计数s0/s1, 表示以0,1结尾且交替的最长子数组
class Solution {public int numberOfAlternatingGroups(int[] colors, int k) {int res = 0;int n = colors.length;// 环形扩增int[] arr = new int[n + k - 1];for (int i = 0; i < n + k - 1; i++) arr[i] = colors[i % n];// 引入状态计数,表示以0,1结尾符合交替的最长计数int s0 = 0, s1 = 0;// 枚举右端点for (int i = 0; i < n + k - 1; i++) {if (arr[i] == 0) {s0 = s1 + 1;s1 = 0;} else {s1 = s0 + 1;s0 = 0;}if (s1 >= k) res += 1;if (s0 >= k) res += 1;}return res;}
}
class Solution:def numberOfAlternatingGroups(self, colors: List[int], k: int) -> int:res = 0colors += colors[0:k-1]s0, s1 = 0, 0for c in colors:if c == 0:s0, s1 = s1 + 1, 0res += 1 if s0 >= k else 0else:s0, s1 = 0, s0 + 1res += 1 if s1 >= k else 0return res

T4. 子数组按位与值为 K 的数目

这题属于糖题,方法特别多

按位与的序列,它有一个显著的特点,就是呈现单调性

方法一: 位运算结论题

结论:

按位与的序列,最多变化 l o g 2 ( v ) , v 为值域 按位与的序列,最多变化log_2(v), v为值域 按位与的序列,最多变化log2(v),v为值域

同样是枚举右端点,然后处理这个 l o g 2 ( v ) log_2(v) log2(v)点即可。

时间复杂度为 O ( n l o g v ) O(n log v) O(nlogv), v为值域

class Solution {public long countSubarrays(int[] nums, int k) {long res = 0;int n = nums.length;// 维护值/位置的信息TreeMap<Integer, Integer> prev = new TreeMap<>();for (int i = 0; i < n; i++) {TreeMap<Integer, Integer> next = new TreeMap<>();for (var kv: prev.entrySet()) {next.put(kv.getKey() & nums[i], kv.getValue());}next.put(nums[i], i);// 如果存在k值,必然存在一个区间if (next.containsKey(k)) {var nk = next.lowerEntry(k);if (nk == null) {res += next.get(k) + 1;} else {res += (next.get(k) - nk.getValue());}}prev = next;}return res;}
}

方法二: ST表 + 三指针

其实ST表上二分也可以,但是三指针处理起来更优雅

这样时间复杂度为

  • ST预处理 O ( n l o g n ) O(nlogn) O(nlogn)
  • 枚举+三指针 O ( n ) O(n) O(n)
class Solution {public long countSubarrays(int[] nums, int k) {long res = 0;int n = nums.length;SparesTable st = new SparesTable(nums, (a, b) -> a & b);int j0 = 0, j1 = 0;for (int i = 0; i < n; i++) {// 注意是 <while (j0 <= i && st.query(j0, i) < k) {j0++;}// 注意是 <=while (j1 <= i && st.query(j1, i) <= k) {j1++;}res += (j1 - j0);}return res;}staticclass SparesTable {int[][] tables;BiFunction<Integer, Integer, Integer> callback;public SparesTable(int[] arr, BiFunction<Integer, Integer, Integer> callback) {int n = arr.length;int m = (int)(Math.log(n) / Math.log(2) + 1);tables = new int[m][n];this.callback = callback;for (int i = 0; i < n; i++) {tables[0][i] = arr[i];}for (int i = 1; i < m; i++) {int half = 1 << (i - 1);for (int j = 0; j + half < n; j++) {tables[i][j] = callback.apply(tables[i - 1][j], tables[i - 1][j + half]);}}}// 闭闭区间int query(int l, int r) {int t = (int)(Math.log(r - l + 1) / Math.log(2));return callback.apply(tables[t][l], tables[t][r - (1 << t) + 1]);}}
}

写在最后

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/42234.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生产调度:flowshop问题数学建模

接上一篇文章&#xff0c;在了解生产调度问题的背景和基本概念之后&#xff0c;我想先从比较基础的 flowshop和 jobshop 数学模型入手&#xff0c;理解实际调度过程中的问题求解思路。这一篇文章主要面向 flowshop 问题进行数学建模&#xff0c;对于这类比较经典的问题&#xf…

2007-2022年 国内各上市公司绿色化转型数据.(Excel文件、dta文件、参考文献、计算方法与说明)

上市公司绿色化转型数据为研究者提供了评估企业在生态文明建设、循环经济和绿色管理方面表现的重要视角。以下是对中国各上市公司绿色化转型数据的介绍&#xff1a; 数据简介 定义&#xff1a;上市公司绿色化转型是指企业在发展模式上向可持续发展转变&#xff0c;实现资源节…

成人高考报名条件及收费标准详解

成人高考报名条件及收费标准详解 您想通过成人高考改变自己的命运&#xff0c;但不知道报名条件和收费标准&#xff1f;本文将为您详细介绍成人高考报名条件和收费标准&#xff0c;并为您提供专业的成人教育服务。 深圳成人高考www.shenzhixun.com 成人高考报名条件 成人高考…

CH11_JS的多重循环

第11章&#xff1a;Javascript的多重循环 本章目标 掌握二重循环的使用 掌握二重循环的控制语句的使用 课程回顾 循环控制有那几种方式 讲解内容 1. 回顾练习 需求说明 某次程序大赛&#xff0c;AI2101班有4名学员参加&#xff0c;学员的成绩由用户输入&#xff0c;计算…

那你真的了解方法调用吗?

方法调用是不是很熟悉&#xff1f;那你真的了解它吗&#xff1f;今天就让我们来盘一下它。 首先大家要明确一个概念&#xff0c;此处的方法调用并不是方法中的代码被执行&#xff0c;而是要确定被调用方法的版本&#xff0c;即最终会调用哪一个方法。 之前我们了解到&#xff…

Android C++系列:Linux Socket编程(三)CS模型示例

1. TCP通信 下图是基于TCP协议的客户端/服务器程序的一般流程: 服务器调用socket()、bind()、listen()完成初始化后,调用accept()阻塞等待,处于 监听端口的状态,客户端调用socket()初始化后,调用connect()发出SYN段并阻塞等待服 务器应答,服务器应答一个SYN-ACK段,客户…

Blazor SPA 的本质是什么以及服务器端渲染如何与 Blazor 的新 Web 应用程序配合使用

Blazor 通常被称为单页应用程序 (SPA) 框架。当我第一次开始使用 Blazor 时&#xff0c;我对 SPA 的含义、组件如何为 SPA 架构做出贡献以及所有这些如何与交互性联系在一起感到困惑。 今天&#xff0c;我将解答大家可能关心的三个问题&#xff1a; 什么是 SPA&#xff1f;了…

【高中数学/基本不等式】当x是正实数时,求函数f(x)=x/(1+x^2)的最大值?

【问题】 当x是正实数时&#xff0c;求函数f(x)x/(1x^2)的最大值&#xff1f; 【解答】 解&#xff1a; f(x)x/(1x^2)1/(x1/x))<1/2倍根号下(x*1/x)1/2 所以函数在[0,∞)的区域最大值为0.5 【函数图像】 f(x)x/(1x^2)是奇函数&#xff0c;没有断点&#xff0c;是可以…

文心一言最常用的20条指令及指令说明,含增强指令

下面是20条文心一言的指令及其说明&#xff0c;每条指令尽量简洁明了&#xff0c;以便在有限的字数内提供尽可能多的信息。以下是这些指令及其说明&#xff1a; 1. 查询天气 指令&#xff1a;今天北京的天气怎么样&#xff1f;说明&#xff1a;此指令用于查询特定城市&#xf…

HarmonyOS Next系列之Echarts图表组件(折线图、柱状图、饼图等)实现(八)

系列文章目录 HarmonyOS Next 系列之省市区弹窗选择器实现&#xff08;一&#xff09; HarmonyOS Next 系列之验证码输入组件实现&#xff08;二&#xff09; HarmonyOS Next 系列之底部标签栏TabBar实现&#xff08;三&#xff09; HarmonyOS Next 系列之HTTP请求封装和Token…

Redis高级篇之最佳实践

Redis高级篇之最佳实践 今日内容 Redis键值设计批处理优化服务端优化集群最佳实践 1、Redis键值设计 1.1、优雅的key结构 Redis的Key虽然可以自定义&#xff0c;但最好遵循下面的几个最佳实践约定&#xff1a; 遵循基本格式&#xff1a;[业务名称]:[数据名]:[id]长度不超过…

PCIe 规范核心知识线介绍

0&#xff0c;总体Topology x86 处理器系统中 PCIe的拓扑结构&#xff1a; PCIe Switch的总体结构 1&#xff0c;PCIe 枚举 BIOS 负责枚举与分派配置设备的 BusID[7:0] : DeviceID[4:0] : FunctionID[2:0]; cpu先识别 Host-PCI-Bridge&#xff0c;其下是Bus0&#xff1b; 在…

树莓派学习笔记18:IIC驱动_PCA9685(16路舵机驱动模块)误发

今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi) 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: ​ Python 版本3.7.3: ​ IIC驱动_PCA9685(16路舵机驱动模块) 文章提供测试代码讲解,整体代码贴出、测试效果图 目录 开启树莓…

什么是 HTTP POST 请求?初学者指南与示范

在现代网络开发领域&#xff0c;理解并应用 HTTP 请求 方法是基本的要求&#xff0c;其中 "POST" 方法扮演着关键角色。 理解 POST 方法 POST 方法属于 HTTP 协议的一部分&#xff0c;主旨在于向服务器发送数据以执行资源的创建或更新。它与 GET 方法区分开来&…

尚硅谷 一 JS简介

一 JS简介 1.1 JS起源 Javascript是一种由Netscape(网景)的LiveScript发展而来的原型化继承的面向对象的动态类型的区分大小写的客户端脚本语言&#xff0c;主要目的是为了解决服务器端语言&#xff0c;遗留的速度问题&#xff0c;为客户提供更流畅的浏览效果。当时服务端需要…

vue3+vue-router+vite 实现动态路由

文章中出现的代码是演示版本&#xff0c;仅供参考&#xff0c;实际的业务需求会更加复杂 什么是动态路由 什么场景会用到动态路由 举一个最常见的例子&#xff0c;比如说我们要开发一个后台管理系统&#xff0c;一般来说后台管理系统都会分角色登录&#xff0c;这个时候也就涉…

第4章 课程发布:模块需求分析,课程预览(模板引擎 静态页面),课程审核,课程发布(分布式事务,页面静态化:熔断降级),课程搜索(es索引)

1 模块需求分析 1.1 模块介绍 课程信息编辑完毕即可发布课程&#xff0c;发布课程相当于一个确认操作&#xff0c;课程发布后学习者在网站可以搜索到课程&#xff0c;然后查看课程的详细信息&#xff0c;进一步选课、支付、在线学习。 下边是课程编辑与发布的整体流程&#…

一.2.(1)双极型晶体三极管的结构、工作原理、特性曲线及主要参数

1.双极型晶体三极管的结构 学会区分P管和N管&#xff0c;会绘制符号 2.工作原理 无论是PNP 还是NPN&#xff0c;本质上放大时&#xff0c;都是发射结正偏&#xff0c;集电极反偏。&#xff08;可以简单理解为pn为二极管&#xff0c;每个三极管都有两个二极管&#xff09; 其中电…

前端面试题22(js中sort常见的用法)

JavaScript 的 sort() 方法是数组的一个非常强大的功能&#xff0c;用于对数组的元素进行排序。这个方法直接修改原数组&#xff0c;并返回排序后的数组。sort() 的默认行为是将数组元素转换为字符串&#xff0c;然后按照字符串的 Unicode 字典顺序进行排序。这意味着如果你试图…

Linux内存管理--系列文章柒——硬件架构

一、引子 之前文章讲解的是系统的虚拟内存&#xff0c;本章讲述这些硬件的架构和系统怎样统一管理这些硬件的。 二、物理内存模型 物理内存模型描述了计算机系统中的物理内存如何由操作系统组织和管理。它定义了物理内存如何划分为单元&#xff0c;如何寻址这些单元以及如何…