Leetcode - 周赛424

ops/2024/11/29 3:38:05/

目录

一,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.ppmy.cn/ops/137548.html

相关文章

Tri Mode Ethernet MAC IP核详解

本文对 Vivado 的三速 MAC IP 核&#xff08;Tri Mode Ethernet MAC&#xff0c;TEMAC&#xff09;进行介绍。 在自行实现三速以太网 MAC 控制器时&#xff0c;GMII/RGMII 接口可以通过 IDDR、ODDR 原语实现&#xff0c;然而实际使用中自己实现的模块性能不是很稳定&#xff08…

单片机电路基本知识

单片机电路基本知识 MCU(C51) 概念&#xff1a;应用实例家用电子&#xff0c;汽车电子&#xff0c;嵌入式系统&#xff0c;低成本&#xff0c;低功耗&#xff0c;小型化&#xff0c;通常使用c语言或者汇编语言&#xff0c;用于家用电器控制&#xff0c;智能家居&#xff0c;汽…

使用flink编写WordCount

1. env-准备环境 2. source-加载数据 3. transformation-数据处理转换 4. sink-数据输出 5. execute-执行 流程图&#xff1a; DataStream API开发 //nightlies.apache.org/flink/flink-docs-release-1.13/docs/dev/datastream/overview/ 添加依赖 <properties>&l…

C语言超详细教程

系列文章目录 文章目录 系列文章目录1 运算符1.1 算术运算符:2 控制语句2.1 条件语句:2.2 循环语句:3 函数3.1 函数的定义与声明:3.2 递归函数:4 指针4.1 指针的定义与使用函数指针:5. 数组与字符串5.1 数组一维数组:相同类型元素的集合(如:多维数组:数组的数组(如:…

【多线程-第一天-多线程的技术方案-pthread演示 Objective-C语言】

一、多线程的技术方案 1.我们来看一下多线程的技术方案 技术方案 pthread:一套通用的多线程API、适用于Unix\Linux Windows等系统、跨平台、可移植、使用难度大、C语言、线程的生命周期由程序员管理、使用频率:几乎不用 NSThread:使用更加面向对象、简单易用、可直接操作…

macos 14.0 Monoma 修改顶部菜单栏颜色

macos 14.0 设置暗色后顶部菜单栏还维持浅色&#xff0c;与整体不协调。 修改方式如下&#xff1a;

小程序-基于java+SpringBoot+Vue的铁路订票平台小程序设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

树莓派3:64位系统串口(UART)使用问题的解决方法

前言 当我们要使用串口进行zigbee的短距离通信时,发现无法使用串口. 原因 树莓派3bCPU内部有两个串口,一个硬件串口(就是我们平时使用的UART),还有一个迷你串口(mini-uart),在老版本的树莓派中把硬件串口分配在GPIO上,可以单独使用.但是在新的树莓派中官方把硬件串口给了蓝牙…