Leetcode - 周赛424

目录

一,3354. 使数组元素等于零

二, 3355. 零数组变换 I

三,3356. 零数组变换 II

四,3357. 最小化相邻元素的最大差值


一,3354. 使数组元素等于零

本题实际上是一个前/后缀和的问题,就是判断前缀和与后缀和的值是否相同,如果相同且当前位置的值为0,说明往左走和往右走都可以,ans += 2;如果前缀和与后缀和的值差1,如果相同且当前位置的值为0,说明只能往左走/只能往右走,ans += 1。其他情况都不会使得nums中所有元素为0,直接返回 ans。

代码如下:

class Solution {public int countValidSelections(int[] nums) {int s = 0;for(int x : nums){s += x;}int pre = 0, cnt = 0;for(int x : nums){if(x > 0){pre += x;}else if(pre == s - pre){cnt += 2;}else if(Math.abs(pre*2-s) == 1){cnt += 1;}}return cnt;}
}

二, 3355. 零数组变换 I

本题就是一道简单的差分题:

class Solution {public boolean isZeroArray(int[] nums, int[][] queries) {int n = nums.length;int[] arr = new int[n+1];for(int[] q : queries){int l = q[0], r = q[1];arr[l] -= 1;arr[r+1] += 1;}long s = 0;for(int i=0; i<n; i++){s += arr[i];if(s + nums[i] > 0) return false;}return true;}
}

三,3356. 零数组变换 II

本题可以直接使用二分 + 差分:

class Solution {public int minZeroArray(int[] nums, int[][] queries) {int l = 0, r = queries.length;while(l <= r){int k = (l + r) / 2;if(check(nums, queries, k)){r = k - 1;}else{l = k + 1;}}return r+1 <= queries.length ? r+1 : -1;}boolean check(int[] nums, int[][] queries, int k){int n = nums.length;int[] diff = new int[n+1];for(int i=0; i<k; i++){int[] q = queries[i];int l = q[0], r = q[1], val = q[2];diff[l] -= val;diff[r+1] += val;}long s = 0;for(int i=0; i<n; i++){s += diff[i];if(s + nums[i] > 0) return false;}return true;}
}

也可以使用双指针 + 差分,枚举nums数组,同时枚举执行 queries[k],直到 nums[i] = 0,跳出里面循环,枚举下一个 nums[i]。

代码如下:

class Solution {public int minZeroArray(int[] nums, int[][] queries) {int n = nums.length;int[] diff = new int[n+1];int k = 0, sum = 0;for(int i=0; i<n; i++){int x = nums[i];sum += diff[i];while(k < queries.length && sum + x > 0){int[] q = queries[k];int l = q[0], r = q[1], val = q[2];diff[l] -= val;diff[r+1] += val;if(l <= i && i <= r){//满足 i 在 [L,R]sum -= val;}k++;}if(sum + x > 0) return -1; }return k;}
}

四,3357. 最小化相邻元素的最大差值

如果两个数相邻没有-1,那么它们的绝对值差是固定的,可以直接计算;如果两个数相邻有-1,那么就需要进行分类讨论了(这里需要先算出与-1相邻的所有数中的最大值maxR和最小值minL,因为不管(x,y)取什么,都需要和这两值求绝对差):

  • 如果没有连续的 -1,对于 -1 左右的两个数 l 和 r (l <= r),它们的绝对差一定是 min((maxR - l+1) / 2,(r - minL+1) / 2)
  • 如果有连续的 -1,对于连续 -1 左右的两个数 l 和 r (l <= r),它们的绝对差一定是 min((maxR - l + 1) / 2,(r - minL + 1) / 2,(maxR - maxL + 2) / 3)
  • 这里忽略了一种情况,如果是前缀-1/后缀-1时,它只有一个数 x,它的绝对差是 min((maxR - x + 1) / 2,(x - minL + 1) / 2)
class Solution {public int minDifference(int[] nums) {int n = nums.length;int minL = Integer.MAX_VALUE;int maxR = 0;for(int i = 0; i < n; i++){if(nums[i] != -1 && (i > 0 && nums[i-1] == -1 ||i < n- 1 && nums[i+1] == -1)){minL = Math.min(minL, nums[i]);maxR = Math.max(maxR, nums[i]);}}int preI = -1;for(int i = 0; i < n; i++){if(nums[i] == -1) continue;if(preI >= 0){if(i - preI == 1){//相邻两个非0数的绝对差ans = Math.max(ans, Math.abs(nums[i] - nums[preI]));}else{// i - preI > 2:判断是否有连续的-1update(Math.min(nums[preI], nums[i]), Math.max(nums[preI], nums[i]), i - preI > 2, minL, maxR);}}else if(i > 0){//-1 -1 -1 2 的情况update(nums[i], nums[i], false, minL, maxR);}preI = i;}if(0 <= preI && preI < n - 1)// 2 -1 -1 -1 的情况update(nums[preI], nums[preI], false, minL, maxR);return ans;}private int ans;void update(int l, int r, boolean big, int minL, int maxR){int d = (Math.min(r-minL, maxR-l) + 1) / 2;if(big) {//如果有连续的-1,还需要和 (maxR - minL + 2) / 3 比较d = Math.min(d, (maxR - minL + 2) / 3);}ans = Math.max(ans, d);}
}

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

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

相关文章

Vue2中 vuex 的使用

1.安装 vuex 安装vuex与vue-router类似&#xff0c;vuex是一个独立存在的插件&#xff0c;如果脚手架初始化没有选 vuex&#xff0c;就需要额外安装。 yarn add vuex3 或者 npm i vuex3 233 Vue2 Vue-Router3 Vuex3 344 Vue3 Vue-Router4 Vuex4 2. 新建 store/index.j…

数据结构C语言描述5(图文结合)--队列,数组、链式、优先队列的实现

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法&#xff1b;有C基础即可跟着学习&#xff0c;代码均可运行&#xff1b;准备考研的也可跟着写&#xff0c;个人感觉&#xff0c;如果时间充裕&#xff0c;手写一遍比看书、刷题管用很多&#xff0c;这也是本人采用纯C语言…

Windows修复SSL/TLS协议信息泄露漏洞(CVE-2016-2183) --亲测

漏洞说明&#xff1a; 打开链接&#xff1a;https://docs.microsoft.com/zh-cn/troubleshoot/windows-server/windows-security/restrict-cryptographic-algorithms-protocols-schannel 可以看到&#xff1a; 找到&#xff1a;应通过配置密码套件顺序来控制 TLS/SSL 密码 我们…

深度学习图像视觉 RKNN Toolkit2 部署 RK3588S边缘端 过程全记录

深度学习图像视觉 RKNN Toolkit2 部署 RK3588S边缘端 过程全记录 认识RKNN Toolkit2 工程文件学习路线&#xff1a; Anaconda Miniconda安装.condarc 文件配置镜像源自定义conda虚拟环境路径创建Conda虚拟环境 本地训练环境本地转换环境安装 RKNN-Toolkit2&#xff1a;添加 lin…

controller中的参数注解@Param @RequestParam和@RequestBody的不同

现在controller中有个方法&#xff1a;&#xff08;LoginUserRequest是一个用户类对象&#xff09; PostMapping("/test/phone")public Result validPhone(LoginUserRequest loginUserRequest) {return Result.success(loginUserRequest);}现在讨论Param("login…

Android按键点击事件三种实现方法

1. 在xml文件中为 Button 添加android:onclick属性 由于没有onclick这个函数&#xff0c;onclick下面会提示红色波浪线错误&#xff0c;然后单击一下"onclick"按住键盘上AltEnter键,选择在activity中生成函数 public void onclick(View view) {Toast.makeText(this,&…

全景图像(Panorama Image)向透视图像(Perspective Image)的跨视图转化(Cross-view)

一、概念讲解 全景图像到透视图像的转化是一个复杂的图像处理过程&#xff0c;它涉及到将一个360度的全景图像转换为一个具有透视效果的图像&#xff0c;这种图像更接近于人眼观察世界的方式。全景图像通常是一个矩形图像&#xff0c;它通过将球面图像映射到平面上得到&#xf…

RabbitMQ7:消息转换器

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

C#开发合集

用C#轻松搞定m3u8视频下载与合并 嘿&#xff0c;程序员们&#xff01;今天咱们来聊聊如何用C#写个小程序&#xff0c;轻松下载和合并m3u8视频文件。没错&#xff0c;就是那种分段的流媒体视频。准备好了吗&#xff1f;让我们开始吧&#xff01; 准备工作 在动手之前&#xf…

HarmonyOS4+NEXT星河版入门与项目实战(22)------动画(属性动画与显示动画)

文章目录 1、属性动画图解2、案例实现-小鱼移动游戏1、代码实现2、代码解释3、资源图片4、实现效果3、显示动画4、案例修改-显示动画5、总结1、属性动画图解 这里我们用一张完整的图来汇整属性动画的用法格式和使用的主要属性范围,如下所示: 2、案例实现-小鱼移动游戏 1、代…

【rustdesk】客户端和服务端的安装和部署(自建服务器,docker,远程控制开源软件rustdesk)

【rustdesk】客户端和服务端的安装和部署&#xff08;自建服务器&#xff0c;docker&#xff09; 一、官方部署教程 https://rustdesk.com/docs/zh-cn/client/mac/ 官方服务端下载地址 https://github.com/rustdesk/rustdesk-server/releases 我用的docker感觉非常方便&am…

Qt程序发布及打包成exe安装包

参考:Qt之程序发布以及打包成exe安装包 目录 一、简述 Qt 项目开发完成之后,需要打包发布程序,而因为用户电脑上没有 Qt 配置环境,所以需要将 release 生成的 exe 文件和所依赖的 dll 文件复制到一个文件夹中,然后再用 Inno Setup 打包工具打包成一个 exe 安装包,就可以…

python学opencv|读取图像

【1】引言 前序学习了使用matplotlib模块进行画图&#xff0c;今天开始我们逐步尝试探索使用opencv来处理图片。 【2】学习资源 官网的学习链接如下&#xff1a; OpenCV: Getting Started with Images 不过读起来是英文版&#xff0c;可能略有难度&#xff0c;所以另推荐一…

数据结构 ——— 归并排序算法的实现

目录 归并排序的思想 归并排序算法的实现 归并排序的思想 将已经有序的子序列合并&#xff0c;得到完全有序的序列&#xff0c;即先使每个子序列有序后&#xff0c;再使子序列段间有序 若将两个有序表合并成一个有序表&#xff0c;称为二路归并 归并排序步骤示意图&#x…

Springboot项目搭建(6)-前端登录跳转与Pinia实用

1.添加响应错误拦截 文件地址&#xff1a;src\utils\request.js import axios from axios import { ElMessage } from element-plus const baseURL /api const instance axios.create({baseURL}) //添加拦截器 instance.interceptors.response.use(result>{&#x1f447…

多输入多输出 | Matlab实现TCN-LSTM时间卷积神经网络结合长短期记忆神经网络多输入多输出预测

多输入多输出 | Matlab实现TCN-LSTM时间卷积神经网络结合长短期记忆神经网络多输入多输出预测 目录 多输入多输出 | Matlab实现TCN-LSTM时间卷积神经网络结合长短期记忆神经网络多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 多输入多输出 | Matlab实现…

C++网络编程:select IO多路复用及TCP服务器开发

C网络编程&#xff1a;使用select实现IO多路复用 一、什么是 IO 多路复用&#xff1f;二、IO多路复用器 select三、相关接口3.1、fd_set 结构体3.2、宏和函数 四、select 实现 TCP 服务器五、总结 一、什么是 IO 多路复用&#xff1f; 在网络编程中&#xff0c;最容易想到的并…

HDU Go Running(最小点覆盖 + 网络流优化)

题目大意&#xff1a;有一条无限长跑道&#xff0c;每个人可以规定自己跑步的方向&#xff0c;起点&#xff0c;跑步起止时间。每个人跑步的速度都是1m/s。最后从监控人员哪里得到了n个报告&#xff0c;每个报告给出了某人在某一时候所在的位置&#xff0c;问跑步的最少可能人数…

28.UE5实现对话系统

目录 1.对话结构的设计&#xff08;重点&#xff09; 2.NPC对话接口的实现 2.1创建类型为pawn的蓝图 2.2创建对话接口 3.对话组件的创建 4.对话的UI设计 4.1UI_对话内容 4.2UI_对话选项 4.3UI_对话选项框 5.对话组件的逻辑实现 通过组件蓝图&#xff0c;也就是下图中的…

Reachy 2,专为AI与机器人实验室打造的卓越开源双臂移动操作平台!

近期&#xff0c;花粉机器人&#xff08;POLLEN ROBOTICS&#xff09;隆重推出Reachy 2仿生机器人——下一代开源操作平台&#xff0c;为AI与机器人实验室带来理想的双臂移动操作科研平台&#xff01; Reachy 2的仿生性&#xff1a; 》拥有两个基于Maxon无刷电机的仿生7自由度…