LeetCode---127双周赛

题目列表

3095. 或值至少 K 的最短子数组 I

3096. 得到更多分数的最少关卡数目

3097. 或值至少为 K 的最短子数组 II

3098. 求出所有子序列的能量和

一、或值至少k的最短子数组I&II

暴力的做法大家都会,这里就不说了,下面我们来看看如何进行优化

其实看到题目,我们就差不多有一个优化的思路:子数组+区间性质 => 滑动窗口,我们需要维护一个或值至少为k的区间(或运算满足数字越多,结果越大的单调性,所以用滑动窗口是可以的

滑动窗口三个步骤:进窗口,判断是否出窗口以及何时更新答案

进窗口时维护区间或值很简单,只要或上当前元素就行,但是我们如何在元素出窗口时,维护区间的或值呢?或运算的本质就是看bit位上是否有1,我们只要维护一个数据用来记录每个bit位上1出现的次数,就能很快的得出当前区间的或值

代码如下

class Solution {
public:int minimumSubarrayLength(vector<int>& nums, int k) {int n = nums.size();int ans = n + 1, or_ = 0;int cnt[32] = { 0 };for(int l = 0, r = 0; r < n; r++){or_ |= nums[r];for(int i = 0; i < 32; i++)cnt[i] += (nums[r]>>i)&1;while(or_ >= k && l <= r){ // 这里一般是不用加l<=r这个条件的,这里是因为k=0会导致越界问题ans = min(ans, r-l+1);for(int i = 0; i < 32; i++){if((nums[l]>>i)&1){if(--cnt[i]==0)or_ &= (~(1<<i));}}l++;}}return ans==n+1?-1:ans;}
};

这里在提供一种方法(or通用模板),如下

代码如下

class Solution {
public:int minimumSubarrayLength(vector<int>& nums, int k) {int n = nums.size();int ans = INT_MAX;vector<pair<int,int>> v;for(int i = 0; i < n; i++){v.emplace_back(0,i); // 以i位左端点,or_ = 0,后面会让它|nums[i]int j = 0;for(auto& p:v){auto&[or_,left] = p;or_ |= nums[i]; // 区间为[left,i]if(or_ >= k)ans = min(ans,i-left+1);if(v[j].first == or_) // 当or_相等时,保留最靠右的左端点下标v[j].second = left;elsev[++j]=p;}v.resize(j+1); // 去重}return ans == INT_MAX?-1:ans;}
};

二、得到更多分数的最少关卡数目

题目说的很复杂,其实很简单,就是模拟,我们只要将数组分为左右两个部分,要求左边部分的得分大于右边部分的得分,问左边部分的最少关卡数(注意:题目要求每个玩家至少要完成一个关卡)代码如下

class Solution {
public:int minimumLevels(vector<int>& possible) {int s = 0;for(auto x:possible)s += 2*x-1;int n = possible.size();for(int i = 0,pre = 0; i < n-1; i++){pre += 2*possible[i]-1;if(pre > s - pre)return i + 1;}return -1;}
};

三、求出所有子序列的能量和

子序列问题一般和顺序无关,这题也一样,我们先给数组排序。问子序列的能量(最小差值),只可能是相邻元素间的差才可能是子序列的能量(排完序后),显然该问题是个经典的相邻相关的子序列问题,即需要记录它的上一个数字是多少,再结合选或不选的思想,我们很容易得到下面这样一个递归函数定义

设 dfs(i,j,pre,mn) 表示 从nums[0]~nums[i]中再选j个充当子序列中的元素,其中pre表示上一个选择的元素,mn记录nums[i+1]~nums[n-1]中选出的k-j个数之间的最小差值,返回值表示已选出的数字组成的子序列的能量

递归入口: 

dfs(n-1,k,INT_MAX/2,INT_MAX/2)

递归出口:

  • j==0时,返回mn --- 表示当前子序列的能量为mn
  • j>i+1时,返回0 --- 剩余元素个数不足j个,不能构成符合要求的子序列,不贡献能量,返回0

递归转移方程:

  • 不选当前元素作为子序列元素:dfs(i-1,j,pre,mn) 
  • 选当前元素作为子序列元素:dfs(i-1,j-1,nums[i],min(mn,pre-nums[i]))

dfs(i,j,pre,mn) = dfs(i-1,j,pre,mn) + dfs(i-1,j-1,nums[i],min(mn,pre-nums[i]))

代码如下

class Solution {
public:int sumOfPowers(vector<int>& nums, int k) {int n = nums.size();sort(nums.begin(),nums.end());const int MOD = 1e9+7;unordered_map<int,unordered_map<int,unordered_map<int,unordered_map<int,int>>>> mp;function<int(int,int,int,int)>dfs=[&](int i,int j,int pre,int mn)->int{if(j==0) return mn;if(j>i+1) return 0;if(mp.count(i)&&mp[i].count(j)&&mp[i][j].count(pre)&&mp[i][j][pre].count(mn))return mp[i][j][pre][mn];int res1 = dfs(i-1,j,pre,mn); // 不选int res2 = dfs(i-1,j-1,nums[i],min(mn,pre-nums[i])); // 选return mp[i][j][pre][mn]=(res1+res2)%MOD;};return dfs(n-1,k,INT_MAX/2,INT_MAX/2);}
};

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

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

相关文章

JDK1.8 有哪些新特性

JDK 1.8引入了多个新特性&#xff0c;显著改善了Java语言的函数式编程能力、集合操作和日期时间处理。以下是一些主要的新特性&#xff1a; Lambda表达式: Lambda表达式提供了一种清晰简洁的方式来表示一段可执行的代码&#xff0c;允许将函数作为参数传递给方法。 // 之前的…

1、快速上手Docker:入门指南

文章目录 Linux中安装docker防火墙端口配置web项目需要的环境安装yarn安装nodejs安装脚手架并准备项目 构建镜像启动镜像查看日志管理镜像推送镜像 发布项目准备服务器环境部署项目&#xff1a; PS&#xff1a;扩展一点小知识 这篇文章只是docker入门的第一个Docker项目&#x…

STM32使用HAL库获取GPS模块HT1818Z3G5L信息(方法1)

1、写在最前 先了解一下GPRMC的格式 格 式&#xff1a; GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,A*50 说 明&#xff1a; 字段 0&#xff1a;$GPRMC&#xff0c;语句ID&#xff0c;表明该语句为Recommended Minimum Specific GPS/TRANSIT Data&…

数据结构|排序总结(1)|直接插入排序

排序分类 插入排序&#xff1a;直接插入排序&#xff0c;希尔排序 选择排序&#xff1a;选择排序&#xff0c;堆排序 交换排序&#xff1a;冒泡排序&#xff0c;快速排序 归并排序 插入排序 直接插入排序 相当于摸牌&#xff0c;例如我们现在手上有{2&#xff0c;4&#xff0…

AcWing 2099. 找到和最大的长度为 K 的子序列

解题思路 用数组来保存数字的出现次数。hash和set不能保存相同的键值&#xff0c;这种情况下只能用数组。 相关代码 class Solution {public int[] maxSubsequence(int[] nums, int k) {int a[] new int[nums.length];for(int i0;i<nums.length;i) a[i] nums[i];Arrays…

C/C++ 查泄漏得一些方法

在 C/C 之中内存泄漏一直是个老大难问题&#xff0c;但索性用于辅助定位查找得解决方案也不少&#xff0c;虽然没那么详细&#xff0c;但总比没有要好的多。 有一些是用三方工具来查得&#xff0c;但这个需要编译debug&#xff0c;带上符号信息得版本才可以&#xff0c;就很麻烦…

volatile 能一个非原子操作变成原子操作吗

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:volatile 能一个非原子操作变成原子操作吗 volatile 关键字在 Java 中主要用于确保多线程环境下的可见性和禁止指令重排序,但它并不能使一个非原…

碘浊度法与红外相机联用测定食品中维生素C

&#x1f31e;欢迎来到看论文的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f4c6;首发时间&#xff1a;&#x1f339;2024年4月6日&…

从新手到专家:精通MacOS上的Homebrew安装

I. 前言 在介绍如何精通MacOS上的Homebrew安装之前&#xff0c;首先需要了解什么是Homebrew以及为什么要使用它。 1. Homebrew是什么&#xff1f; Homebrew是一款开源的软件包管理工具&#xff0c;可以让用户轻松地安装、升级和卸载各种软件包。与其他的软件包管理器相比&am…

PostCss:详尽指南之安装和使用

引言 在现代前端开发中&#xff0c;CSS预处理器如Sass、Less等已经成为提升开发效率、增强代码可维护性的重要工具。然而&#xff0c;随着Web技术的发展&#xff0c;CSS的功能也在不断扩展&#xff0c;一些新的CSS语法&#xff08;如变量、自定义属性、CSS Grid等&#xff09;以…

5.112 BCC工具之ext4slower.py解读

一,工具简介 ext4slower可以显示慢于阈值的ext4读取、写入、打开和fsync操作。 该工具追踪常见的ext4文件操作:读取、写入、打开和同步。它统计在这些操作中花费的时间,并打印超过阈值的每个操作的详细信息。 默认情况下,使用的最小毫秒阈值为10。 二,代码示例 #!/us…

霍兰德职业兴趣测试:发掘你的工作激情与天赋(包含开源免费的API接口)

霍兰德倾向测验的原理 霍兰德职业倾向测验&#xff0c;它是美国著名职业指导专家J&#xff0e;霍兰德&#xff08;HOLLAND&#xff09;编制的&#xff0c;他的职业选择理论把职业分为六种不同类型&#xff0c;即现实型、研究型、艺术型、社会型、企业型、常规型。霍兰德认为&a…

数据库的简单查询

一、检索一列或多列1.检索单独一列 select 列名 from 表名; select order_num from orders; 2.检索多列数据 select 列 1&#xff0c;列 2... from 表名; select order_num,order_date from orders; select order_date,order_num from orders; 3.查询所有字段 select * from…

正排索引 vs 倒排索引 - 搜索引擎具体原理

阅读导航 一、正排索引1. 概念2. 实例 二、倒排索引1. 概念2. 实例 三、正排 VS 倒排1. 正排索引优缺点2. 倒排索引优缺点3. 应用场景 三、搜索引擎原理1. 宏观原理2. 具体原理 一、正排索引 1. 概念 正排索引是一种索引机制&#xff0c;它将文档或数据记录按照某种特定的顺序…

security如何不拦截websocket

只要添加一个关键配置就行 //忽略websocket拦截Overridepublic void configure(WebSecurity webSecurity){webSecurity.ignoring().antMatchers("/**");} 全部代码我放着了 package com.oddfar.campus.framework.config;import com.oddfar.campus.framework.secur…

016——DHT11驱动开发(基于I.MX6uLL)

目录 一、 模块介绍 1.1 简介 1.2 电路描述 1.3 通信协议 二、 驱动程序 三、 应用程序 四、 上机实验 一、 模块介绍 1.1 简介 DHT11 是一款可测量温度和湿度的传感器。比如市面上一些空气加湿器&#xff0c;会测量空气中湿度&#xff0c;再根据测量结果决定是否继续加…

Cortex-M7 内存映射模型

1 前言 如图1所示&#xff0c; Cortex-M7最大支持4GB的内存寻址&#xff0c;并对内存映射(memory map)做了初步的规定&#xff0c;将整个内存空间划分为了多个内存区域(region)。每个内存区域有着既定的内存类型(memory type)和内存属性(memory attribute)&#xff0c;这两者决…

numpy学习笔记,不定期更新

numpy类型入门 import numpy库后&#xff0c;通过numpy参数操作示例 import numpy as np# 创建ndarray&#xff0c;通过list创建 a np.array([1, 2, 3]) print(a)[1 2 3]# 通过元组创建ndarray&#xff0c;并指定数据类型为float (此处是python的float类型&#xff0c;不是n…

从石膏像到真人:素描的进步之路

从石膏像绘画到真人绘画&#xff1a;素描的进步之路怎么走 从石膏像绘画到真人绘画&#xff0c;素描的进步之路可以通过以下几个步骤来实现&#xff1a; 掌握基本技能&#xff1a;在开始真人绘画之前&#xff0c;需要先掌握基本的素描技能&#xff0c;包括构图、明暗关系、观察…

物理层习题及其相关知识(谁看谁不迷糊呢)

1. 对于带宽为50k Hz的信道&#xff0c;若有4种不同的物理状态来表示数据&#xff0c;信噪比为20dB 。&#xff08;1&#xff09; 按奈奎斯特定理&#xff0c;信道的最大传输数据速率是多少&#xff1f;&#xff08;2&#xff09; 按香农定理&#xff0c;信道的最大传输数据速度…