力扣 第 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 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

昇思25天学习打卡营第13天|K近邻算法实现红酒聚类

K近邻算法&#xff08;K-Nearest-Neighbor, KNN&#xff09;是一种用于分类和回归的非参数统计方法&#xff0c;是机器学习最基础的算法之一。它正是基于以上思想&#xff1a;要确定一个样本的类别&#xff0c;可以计算它与所有训练样本的距离&#xff0c;然后找出和该样本最接…

机器学习与现代医疗设备的结合:革新医疗健康的未来

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 随着技术的不断进步&#xff0c;机器学习&#xff08;Machine Learning, ML&#xff09;在现代医疗设备中的应用正在改变着…

7.5cf

Problem - D - Codeforces 大致题目意思&#xff1a;找#的圆心 #include<bits/stdc.h> typedef long long ll;#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0) const ll N1e21; char a[N][N]; using namespace std;int main() {IOS;int t;cin>>t;whi…

含并行连结的网络

一、Inception块 1、白色部分通过降低通道数来控制模型复杂度&#xff0c;蓝色做特征提取工作&#xff0c;每条路上的通道数可能不同&#xff0c;大概我们会把更重要的那部分特征分配更多的通道数 2、Inception只改变高宽&#xff0c;不改变通道数 3、在不同的情况下需要选择…

gitee项目上不同的项目分别使用不用的用户上传

最近使用根据需要&#xff0c;希望不同的项目使用不同的用户上传&#xff0c;让不同的仓库展示不同的用户名&#xff01;&#xff01;&#xff01; 第一步查看全局的用户信息&#xff1a; # 查看目前全局git配置信息 git config -l #会输出全局的git配置信息 第二步进入到要设…

【MySQL】1.初识MySQL

初识MySQL 一.MySQL 安装1.卸载已有的 MySQL2.获取官方 yum 源3.安装 MySQL4.登录 MySQL5.配置 my.cnf 二.MySQL 数据库基础1.MySQL 是什么&#xff1f;2.服务器&#xff0c;数据库和表3.mysqld 的层状结构4.SQL 语句分类 一.MySQL 安装 1.卸载已有的 MySQL //查询是否有相关…

【ubuntu】安装(升级)显卡驱动,黑屏|双屏无法使用问题解决方法

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 ubuntu 安装(升级)显卡驱动&#xff0c;黑屏|双屏无法使用问题解决方法 由于项目需要&#xff0c;对显卡驱动进行升级。升级完就黑屏。。。。&#xff0…

平台稳定性里程碑 | Android 15 Beta 3 已发布

作者 / 产品管理副总裁、Android 开发者 Matthew McCullough 从近期发布的 Beta 3 开始&#xff0c;Android 15 达成了平台稳定性里程碑版本&#xff0c;这意味着开发者 API 和所有面向应用的行为都已是最终版本&#xff0c;您可以查阅它们并将其集成到您的应用中&#xff0c;并…

qt 开发笔记堆栈布局的应用

1.概要 画面中有一处位置&#xff0c;有个按钮点击后&#xff0c;这片位置完全换成另一个画面&#xff0c;这中情况特别适合用堆栈布局。 //堆栈布局的应用 #include <QStackedLayout> QStackedLayout *layout new QStackedLayout(this); layout->setCurrentIndex(…

无法下载cuda

cuda下载不了 一、台式机电脑浏览器打不开cuda下载下面二、解决办法 一、台式机电脑浏览器打不开cuda下载下面 用360、chrome、Edge浏览器都打不开下载页面&#xff0c;有的人说后缀com改成cn&#xff0c;都不行。知乎上说是网络问题&#xff0c;电信换成换成移动/联通的网络会…

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

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

Python结合MobileNetV2:图像识别分类系统实战

一、目录 算法模型介绍模型使用训练模型评估项目扩展 二、算法模型介绍 图像识别是计算机视觉领域的重要研究方向&#xff0c;它在人脸识别、物体检测、图像分类等领域有着广泛的应用。随着移动设备的普及和计算资源的限制&#xff0c;设计高效的图像识别算法变得尤为重要。…

数据结构基础--------【二叉树基础】

二叉树基础 二叉树是一种常见的数据结构&#xff0c;由节点组成&#xff0c;每个节点最多有两个子节点&#xff0c;左子节点和右子节点。二叉树可以用来表示许多实际问题&#xff0c;如计算机程序中的表达式、组织结构等。以下是一些二叉树的概念&#xff1a; 二叉树的深度&a…

高考选专业,兴趣与就业前景该如何平衡?

从高考结束的那一刻开始&#xff0c;有些家长和学生就已经变得焦虑了&#xff0c;因为他们不知道成绩出来的时候学生应该如何填报志愿&#xff0c;也不知道选择什么样的专业&#xff0c;毕竟大学里面的专业丰富多彩&#xff0c;如何选择确实是一门学问&#xff0c;而对于学生们…

Zynq7000系列FPGA中DMA引擎编程指南

DMA引擎的编程指南通常涉及一系列步骤和API调用&#xff0c;以确保数据在内存之间的高效传输&#xff0c;而无需CPU的直接干预。 DMA引擎的编程指南包括以下部分&#xff1a; 一、编写微代码为AXI事务编写CCRx程序 通道微码用于设置dmac.CCRx寄存器以定义AXI事务的属性。这是…

Node.js-path 模块

path 模块 path 模块提供了 操作路径 的功能&#xff0c;如下是几个较为常用的几个 API&#xff1a; 代码实例&#xff1a; const path require(path);//获取路径分隔符 console.log(path.sep);//拼接绝对路径 console.log(path.resolve(__dirname, test));//解析路径 let pa…

java反射介绍

Java反射API允许你在运行时检查和修改程序的行为。这意味着你可以动态地创建对象、查看类的字段、方法和构造函数&#xff0c;甚至调用它们。这是一个强大的特性&#xff0c;但也应该谨慎使用&#xff0c;因为它可以破坏封装性。 以下是使用Java反射的一些常见用途&#xff1a;…

041基于SSM+Jsp的高校校园点餐系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

OPENCV(图像入门笔记)

使用OpenCV读取图像 使用cv.imread()函数读取图像。 第一个参数为图像名称 第二个参数是一个标志&#xff0c;它指定了读取图像的方式。分别有三种 cv.IMREAD_COLOR&#xff1a; 加载彩色图像。任何图像的透明度都会被忽视。它是默认标志。 cv.IMREAD_GRAYSCALE&#xff1a;以…

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

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