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

news2024/9/21 12:25:54

前言

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 0
        return (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 = 0
        colors += colors[0:k-1]
        s0, s1 = 0, 0
        for c in colors:
            if c == 0:
                s0, s1 = s1 + 1, 0
                res += 1 if s0 >= k else 0
            else:
                s0, s1 = 0, s0 + 1
                res += 1 if s1 >= k else 0
        return 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;
    }

    static
    class 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.coloradmin.cn/o/1907278.html

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

相关文章

Docker-11☆ Docker Compose部署RuoYi-Cloud

一、环境准备 1.安装Docker 附:Docker-02-01☆ Docker在线下载安装与配置(linux) 2.安装Docker Compose 附:Docker-10☆ Docker Compose 二、源码下载 若依官网:RuoYi 若依官方网站 鼠标放到"源码地址"上,点击"RuoYi-Cloud 微服务版"。 跳转至G…

Qwen知识蒸馏小试牛刀,在MT-Bench与AlpacaEval 2.0的表现大幅提升

Qwen知识蒸馏小试牛刀&#xff0c;在MT-Bench与AlpacaEval 2.0的表现大幅提升 原创 荷风微摆 YeungNLP 2024年07月08日 01 前言 本文主要分享我们在大模型知识蒸馏上的实验尝试&#xff0c;以及所取得的实验效果提升。我们在5月份完成了该实验&#xff0c;但由于各种原因&…

Springboot实战:AI大模型+亮数据代理助力短视频时代

目录 前言1.如何入门亮数据1.1、注册登录1.2、注册账号1.3、登录1.4、购买静态住宅代理1.5、展示购买的代理 2. 使用Springboot、AI大模型构建系统2.1 使用Springboot、AI大模型构建爬虫2.2、在Springboot项目添加工具 3、编写代码&#xff0c;爬取视频素材3.1、代码里使用代理…

I 2U-Net:具有丰富信息交互的双路径 U-Net 用于医学图像分割| 文献速递-基于深度学习的多模态数据分析与生存分析

Title 题目 I 2U-Net: A dual-path U-Net with rich information interaction for medical image segmentation I 2U-Net&#xff1a;具有丰富信息交互的双路径 U-Net 用于医学图像分割 01 文献速递介绍 在计算机视觉领域&#xff0c;医学图像分割是一个主要挑战&#xff…

深入解析:抖音视频标题的Python爬虫提取方法

引言 随着短视频的兴起&#xff0c;抖音已经成为全球最受欢迎的社交媒体平台之一。对于数据分析师、市场研究人员以及内容创作者来说&#xff0c;能够从抖音上抓取数据是一项宝贵的技能。本文将深入解析如何使用Python编写爬虫程序来提取抖音视频的标题。 爬虫基础 在开始编…

家里猫咪浮毛太多怎么办?值得买的猫毛空气净化器推荐

作为一位拥有5年铲屎经验的铲屎官&#xff0c;我知道许多新手铲屎官可能听说过宠物空气净化器&#xff0c;但了解得不多。事实上&#xff0c;宠物空气净化器确实是养猫家庭必备的小家电之一。它的大面积进风口可以有效吸附空气中的微小浮毛和皮屑&#xff0c;专门的除臭技术能有…

使用 Python 处理 Lumerical 导出的 .txt 文件(完结)

使用 Python 处理 Lumerical 导出的 .txt 文件 引言正文以 , 隔开的波长与透射率以 \t 隔开的波长与透射率引言 之前在 添加链接描述 一文中我们已经介绍了如何将 Lumerical 仿真中的 S 参数相关数据导出为 .txt 文件。这里我们来分享如何使用 Python 对这些数据进行处理。 正…

旋转木马案例

旋转木马 如果接口需要的数据格式和原始数据提供的格式有差异 不要去改接口方法 也不要改原始数据 做一层中间件(数据处理函数/方法) <!DOCTYPE html> <html lang"zh-cn"><head><meta charset"UTF-8"><meta name"viewport…

分销密文下单

背景 事情的经过就是今天早上一共下了10个单&#xff0c;然后就下不了单了。 如下图&#xff1a; 来到抖店后台显示什么解密额度已经用完了 所以&#xff0c;今天必须把困扰我很久的分销密文下单解决掉 操作 1688分销下单-逸淘订单 1 先关联商品 2 下单 首页导航栏--1688分…

重塑通信边界,基于ZYNQ7000 FPGA驱动的多频段多协议软件无线电平台

01、产品概述 本平台是基于高性能ZYNQ-7000系列中的XC7Z045处理器构建的多频段多协议软件无线电解决方案&#xff0c;集成了AD9364芯片——一款业界领先的1x1通道RF敏捷收发器&#xff0c;为无线通信应用提供了强大支持。其存储架构包括2路高速4GB DDR3内存、1路32GB EMMC存储以…

可信验证解释

学习目标&#xff1a;可信验证解释 可信验证是一种基于计算机技术和安全机制&#xff0c;用于确保系统、程序或数据的完整性和可信性的方法。以下是关于可信验证的详细解释&#xff1a;一、定义与原理 可信验证指的是利用计算机技术和安全机制&#xff0c;对系统、程序或数据…

MobaXterm工具

MobaXterm 是一个增强型的 Windows 终端。其为 Windows 桌面提供所有重要的远程网络终端工具&#xff08;如 SSH、X11、RDP、VNC、FTP、SFTP、Telnet、Serial、Mosh、WSL 等&#xff09;&#xff0c;和 Unix 命令&#xff08;如 bash、ls、cat、sed、grep、awk、rsync 等&#…

深度学习编码解码结构-以及kreas简单实现

图像分割中的编码解码结构&#xff08;Encoder-Decoder Model&#xff09;是一种广泛应用的网络架构&#xff0c;它有效地结合了特征提取&#xff08;编码&#xff09;和分割结果生成&#xff08;解码&#xff09;两个过程。以下是对图像分割中编码解码结构的详细解析&#xff…

写一个函数,返回参数二进制中 1 的个数

代码要求 输入一个整数n&#xff0c;输出该数32位二进制中为1的个数&#xff08;包括最高位的符号位&#xff09;&#xff0c;其中负数用补码表示 如&#xff1a;输入&#xff1a;15 &#xff08;15的二进制表示&#xff1a;0000 1111&#xff09; 输出&#xff1a;4 代码实…

音频demo:使用fdk-aac将PCM数据编码成aac数据

1、README a. 编译 编译demo 本demo是使用的开源项目fdk-aac将PCM数据编码成aac音频文件。由于提供的.a静态库是在x86_64的机器上编译的&#xff0c;所以默认情况下仅支持该架构的主机上编译运行。 $ make编译fdk-aac&#xff08;可选&#xff09; 如果想要在其他架构的CP…

20240709 每日AI必读资讯

&#x1f9e0;手把手教你如何打造《星际穿越》中的 TARS 机器人复制品&#xff01; - 一位名为 Charles Diaz 的开发者使用树莓派创建了一个完全功能的 TARS 复制品。 - 使用树莓派3B作为主控&#xff0c;配合Adafruit PCA-9685伺服驱动器&#xff0c;通过编写的步态控制程序…

【版面费优惠丨ACM独立出版丨接受全文摘要投稿】2024年生物医药和智能技术国际学术会议(ICBIT 2024,8月23-25)

“2024年生物医药和智能技术国际学术会议&#xff08;ICBIT 2024&#xff09;”拟定于2024年8月23-25日于珠海召开。近年来&#xff0c;智能技术已经逐渐走入生物医药领域&#xff0c;并在与生物医药领域的融合创新中凸显出巨大的发展潜力和社会价值。人工智能技术在生物医药领…

原创作品——教育课程界面设计

教育行业UI界面设计需直观易懂&#xff0c;确保学习者能迅速上手&#xff0c;减少认知负担。布局清晰&#xff0c;导航便捷&#xff0c;功能按钮和图标设计应符合教育场景&#xff0c;直接支持学习目标的达成&#xff0c;促进高效学习体验。 通过丰富的互动元素&#xff08;如拖…

面试题005-Java-JVM(上)

面试题005-Java-JVM(上) 目录 面试题005-Java-JVM(上)题目自测题目答案1. JVM由哪几部分组成&#xff1f;2. 运行时数据区中包含哪些区域&#xff1f;3. 栈和堆中分别存放什么数据&#xff1f;4. 为什么要将永久代 (PermGen) 替换为元空间 (MetaSpace) &#xff1f;5. 堆空间的…