力扣周赛:第424场周赛

👨‍🎓作者简介:爱好技术和算法的研究生
🌌上期文章:力扣周赛:第422场周赛
📚订阅专栏:力扣周赛
希望文章对你们有所帮助

第一道题模拟题,第二道题经典拆分数组/线段树都可以做,这两个要是都不会那就是基础不行,需要差缺补漏了。第三题那个味太足了,一看那个答案的顺序性就知道要二分答案了,也很简单。

力扣周赛:第424场周赛

  • 使数组元素等于零
  • 零数组变换 I
  • 零数组变换 II

使数组元素等于零

题目描述
给你一个整数数组 nums 。

开始时,选择一个满足 nums[curr] == 0 的起始位置 curr ,并选择一个移动 方向 :向左或者向右。

此后,你需要重复下面的过程:

  • 如果 curr 超过范围 [0, n - 1] ,过程结束。
  • 如果 nums[curr] == 0 ,沿当前方向继续移动:如果向右移,则 递增 curr ;如果向左移,则 递减 curr 。
  • 如果 nums[curr] > 0:
    • 将 nums[curr] 减 1 。
    • 反转 移动方向(向左变向右,反之亦然)。
    • 沿新方向移动一步。

如果在结束整个过程后,nums 中的所有元素都变为 0 ,则认为选出的初始位置和移动方向 有效 。

返回可能的有效选择方案数目。
示例1
在这里插入图片描述

示例2
输入:nums = [2,3,4,0,4,1,0]

输出:0

解释:
不存在有效的选择方案。

提示

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 100
  • 至少存在一个元素 i 满足 nums[i] == 0 。

模拟题,没啥好说的

class Solution {public int countValidSelections(int[] nums) {int ans = 0;for(int i = 0; i < nums.length; ++i){if(nums[i] == 0){int[] temp1 = new int[nums.length];int[] temp2 = new int[nums.length];for(int j = 0; j < nums.length; ++j){temp1[j] = nums[j];temp2[j] = nums[j];}if(check(temp1, i, 1))ans++;if(check(temp2, i, -1))ans++;}}return ans;}public boolean check(int[] nums, int cur, int dir){while(true){cur = cur + dir;if(cur < 0 || cur == nums.length)break;if(nums[cur] > 0){nums[cur]--;dir *= -1;}}for(int i = 0; i < nums.length; ++i){if(nums[i] != 0)return false;}return true;}
}

零数组变换 I

题目描述
给定一个长度为 n 的整数数组 nums 和一个二维数组 queries,其中 queries[i] = [li, ri]

对于每个查询 queries[i]:

  • 在 nums 的下标范围 [li, ri] 内选择一个下标子集。
  • 将选中的每个下标对应的元素值减 1。

零数组 是指所有元素都等于 0 的数组。

如果在按顺序处理所有查询后,可以将 nums 转换为 零数组 ,则返回 true,否则返回 false。

数组的 子集 是对数组元素的选择(可能为空)。
示例1
输入: nums = [1,0,1], queries = [[0,2]]

输出: true

解释:

  • 对于 i = 0:
    选择下标子集 [0, 2] 并将这些下标处的值减 1。
    数组将变为 [0, 0, 0],这是一个零数组。

示例2
输入: nums = [4,3,2,1], queries = [[1,3],[0,2]]

输出: false

解释:

  • 对于 i = 0:
    选择下标子集 [1, 2, 3] 并将这些下标处的值减 1。
    数组将变为 [4, 2, 1, 0]。
  • 对于 i = 1:
    选择下标子集 [0, 1, 2] 并将这些下标处的值减 1。
    数组将变为 [3, 1, 0, 0],这不是一个零数组。

提示

  • 1 <= nums.length <= 105
  • 0 <= nums[i] <= 105
  • 1 <= queries.length <= 105
  • queries[i].length == 2
  • 0 <= li <= ri < nums.length

很显然是拆分数组,直接维护一个f,其中f[i]表示nums[i]共处在哪些区间中,只要f[i] >= nums[i],则说明肯定是可以在queries中将其处理到0。
所以问题转化为某个下标处在哪些区间中,对于每个query的起始点start和终止点end,只需要让f[start]++和f[end + 1]–,即可维护这部分关系了。

class Solution {public boolean isZeroArray(int[] nums, int[][] queries) {int[] f = new int[nums.length];for(int[] query : queries){int start = query[0], end = query[1];f[start]++;if(end + 1 >= nums.length)continue;f[end + 1]--;}int sum=0;for(int i = 0; i < nums.length; ++i){sum += f[i];if(nums[i] > sum)return false;}return true;}
}

零数组变换 II

题目描述
给你一个长度为 n 的整数数组 nums 和一个二维数组 queries,其中 queries[i] = [li, ri, vali]

每个 queries[i] 表示在 nums 上执行以下操作:

  • 将 nums 中 [li, ri] 范围内的每个下标对应元素的值 最多 减少 vali。
  • 每个下标的减少的数值可以独立选择。

零数组 是指所有元素都等于 0 的数组。

返回 k 可以取到的 最小非负 值,使得在 顺序 处理前 k 个查询后,nums 变成 零数组。如果不存在这样的 k,则返回 -1。
示例1
输入: nums = [2,0,2], queries = [[0,2,1],[0,2,1],[1,1,3]]

输出: 2

解释:

  • 对于 i = 0(l = 0, r = 2, val = 1):
    • 在下标 [0, 1, 2] 处分别减少 [1, 0, 1]。
    • 数组将变为 [1, 0, 1]。
  • 对于 i = 1(l = 0, r = 2, val = 1):
    • 在下标 [0, 1, 2] 处分别减少 [1, 0, 1]。
    • 数组将变为 [0, 0, 0],这是一个零数组。因此,k 的最小值为 2。

示例2
输入: nums = [4,3,2,1], queries = [[1,3,2],[0,2,1]]

输出: -1

解释:

  • 对于 i = 0(l = 1, r = 3, val = 2):
    • 在下标 [1, 2, 3] 处分别减少 [2, 2, 1]。
    • 数组将变为 [4, 1, 0, 0]。
  • 对于 i = 1(l = 0, r = 2, val = 1):
    • 在下标 [0, 1, 2] 处分别减少 [1, 1, 0]。
    • 数组将变为 [3, 0, 0, 0],这不是一个零数组。

提示

  • 1 <= nums.length <= 105
  • 0 <= nums[i] <= 5 * 105
  • 1 <= queries.length <= 105
  • queries[i].length == 3
  • 0 <= li <= ri < nums.length
  • 1 <= vali <= 5

这个顺序性味太足了,直接二分答案是不会超时的,当然了你还是还想优化也可以,因为那个拆分数组肯定是可以在每次复用的时候被二分的。
记得特判一下,我没特判wa了一发。

class Solution {public int minZeroArray(int[] nums, int[][] queries) {int n = nums.length;int now = 0;for(int i = 0; i < n; ++i)now += nums[i];if(now == 0)return 0;int l = 0, r = queries.length - 1;while(l <= r){int mid = (l + r) >> 1;int[] f = new int[n];for(int i = 0; i <= mid; ++i){int start = queries[i][0], end = queries[i][1], val = queries[i][2];f[start] += val;if(end + 1 >= n)continue;f[end + 1] -= val;}int sum = 0;boolean flag = true;for(int i = 0; i < n; ++i){sum += f[i];if(nums[i] > sum){flag = false;break;}}if(!flag){l = mid + 1;}else{r = mid - 1;}}return l >= queries.length ? -1 : l + 1;}
}

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

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

相关文章

STM32单片机设计防儿童人员误锁/滞留车内警报系统

目录 目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 近年来在车辆逐渐普及的情况下&#xff0c;由于家长的疏忽&#xff0c;将…

Vue Canvas实现区域拉框选择

canvas.vue组件 <template><div class"all" ref"divideBox"><!-- 显示图片&#xff0c;如果 imgUrl 存在则显示 --><img id"img" v-if"imgUrl" :src"imgUrl" oncontextmenu"return false" …

React Hooks 深度解析与实战

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 React Hooks 深度解析与实战 React Hooks 深度解析与实战 React Hooks 深度解析与实战 引言 什么是 Hooks? 定义 为什么需要 Ho…

开源音乐分离器Audio Decomposition:可实现盲源音频分离,无需外部乐器分离库,从头开始制作。将音乐转换为五线谱的程序

今天给大家分析一个音频分解器&#xff0c;通过傅里叶变换和信封匹配分离音乐中的各个音符和乐器&#xff0c;实现音乐到乐谱的转换。将音乐开源分离为组成乐器。该方式是盲源分离&#xff0c;从头开始制作&#xff0c;无需外部乐器分离库。 相关链接 代码&#xff1a;https:…

Android 6年经验面试总结 2024.11.15

背景&#xff1a;深圳 面过12家中大厂、4家中小厂&#xff0c;通过4家中大厂&#xff0c;2家offer。 针对六年的求职面试总结&#xff1a;项目经验70%30%基础&#xff08;基础应该必会&#xff09; 对于上来就问八股文的公司&#xff0c;对于已经工作了5年以上的开发来说&…

智慧安防丨以科技之力,筑起防范人贩的铜墙铁壁

近日&#xff0c;贵州省贵阳市中级人民法院对余华英拐卖儿童案做出了一审宣判&#xff0c;判处其死刑&#xff0c;剥夺政治权利终身&#xff0c;并处没收个人全部财产。这一判决不仅彰显了法律的威严&#xff0c;也再次唤起了社会对拐卖儿童犯罪的深切关注。 余华英自1993年至2…

【原创】java+ssm+mysql房屋租赁管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

Linux高阶——1116—环形队列生产者消费者

目录 1、环形队列 2、生产者消费者 环形队列数组实现代码 成功截图 1、环形队列 相比于线性队列&#xff0c;环形队列可以有效避免访问越界问题&#xff0c;使用下标访问队列元素时&#xff0c;到达末尾后下标归0&#xff0c;返回起始位置&#xff0c;使用下标运算即可 a…

9.C++面向对象6(实现一个较为完善的日期类)

⭐本篇重点&#xff1a;const成员变量和函数&#xff0c;取地址重载 ⭐本篇代码&#xff1a;c学习/02.c面向对象-中/2.实现完善的日期类 橘子真甜/c-learning-of-yzc - 码云 - 开源中国 (gitee.com) 目录 一. 日期类分析 二. 代码实现 2.1 构造函数 2.2 拷贝构造 2.3 …

构建SSH僵尸网络

import argparse import paramiko# 定义一个名为Client的类&#xff0c;用于表示SSH客户端相关操作 class Client:# 类的初始化方法&#xff0c;接收主机地址、用户名和密码作为参数def __init__(self, host, user, password):self.host hostself.user userself.password pa…

springboot 文件高效上传

文件上传功能可以说对于后端服务是必须的&#xff0c;不同场景对文件上传的要求也各不相同&#xff0c;有的追求速度&#xff0c;有的注重稳定性&#xff0c;还有的需要考虑文件大小和安全性。所以便有了秒传、断点续传和分片上传等解决方案。 1、总述 秒传 秒传&#xff0c…

MySQL 中的数据排序是怎么实现的

MySQL 内部数据排序机制 1. 排序算法 MySQL 使用不同的算法来对数据进行排序&#xff0c;通常依据数据量和是否有索引来决定使用哪种排序算法。主要的排序算法包括&#xff1a; 文件排序 (File Sort)&#xff1a;这是 MySQL 默认的排序算法&#xff0c;用于无法利用索引或内…

199. 二叉树的右视图【 力扣(LeetCode) 】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 199. 二叉树的右视图 一、题目描述 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 二…

22.useNavigatorOnLine

React useNavigatorOnLine 钩子:如何实时监测用户的在线状态? 在现代 Web 应用中,实时监测用户的在线状态对于提供良好的用户体验至关重要。无论是离线功能还是网络状态提示,都需要准确地知道用户的连接状态。useNavigatorOnLine 钩子提供了一种简单而有效的方式来在 Reac…

Mongo数据库集群搭建

目录 1、Mongo集群优势 1.1 高可用性 1.2 水平扩展性 1.3 高性能 1.4 灵活的架构设计 1.5 数据安全 1.6 管理与监控 2、下载指定操作系统版本包 3、部署和验证工作 3.1 准备配置文件及依赖 3.2 启动第一个节点 3.3 部署更多的节点 3.4 初始化副本集 3.5 设置管理…

DB Type

P位 p 1时段描述符有效&#xff0c;p 0时段描述符无效 Base Base被分成了三个部分&#xff0c;按照实际拼接即可 G位 如果G 0 说明描述符中Limit的单位是字节&#xff0c;如果是G 1 &#xff0c;那么limit的描述的单位是页也就是4kb S位 S 1 表示代码段或者数据段描…

大语言模型通用能力排行榜(2024年11月8日更新)

数据来源SuperCLUE 榜单数据为通用能力排行榜 排名 模型名称 机构 总分 理科 文科 Hard 使用方式 发布日期 - o1-preview OpenAI 75.85 86.07 76.6 64.89 API 2024年11月8日 - Claude 3.5 Sonnet&#xff08;20241022&#xff09; Anthropic 70.88 82.4…

【Unity基础】对比OnCollisionEnter与OnTriggerEnter

在Unity中&#xff0c;OnCollisionEnter 和 OnTriggerEnter 是两种用于处理碰撞的回调函数&#xff0c;但它们的工作方式和使用场景有所不同&#xff1a; 1. OnCollisionEnter 触发条件&#xff1a;当一个带有 Collider 组件并且**未勾选“Is Trigger”**的物体&#xff0c;与…

利用OpenAI进行测试需求分析——从电商网站需求到测试用例的生成

在软件测试工程师的日常工作中&#xff0c;需求分析是测试工作中的关键步骤。需求文档决定了测试覆盖的范围和测试策略&#xff0c;而测试用例的编写往往依赖于需求的准确理解。传统手工分析需求耗时长&#xff0c;尤其在面对大量需求和复杂逻辑时容易遗漏细节。本文将以电商网…

vue之axios根据某个接口创建实例,并设置headers和超时时间,捕捉异常

import axiosNew from axios;//给axios起个别名//创建常量实例 const instanceNew axiosNew.create({//axios中请求配置有baseURL选项&#xff0c;表示请求URL的公共部分&#xff0c;url baseUrl requestUrlbaseURL: baseURL,//设置超时时间为20秒timeout: 20000,headers: {…