Leetcode - 周赛414

news/2024/9/18 8:12:35/ 标签: leetcode, 算法, 职场和发展

目录

一,3280. 将日期转换为二进制表示

二,3281. 范围内整数的最大得分

三,3282. 到达数组末尾的最大得分

四,3283. 吃掉所有兵需要的最多移动次数


一,3280. 将日期转换为二进制表示

本题就是简单的字符串和整数之间的转换,可以直接调用库函数解决,代码如下:

class Solution {public String convertDateToBinary(String date) {String[] t = date.split("-");int i = 0;for(String x : t){t[i++] = Integer.toBinaryString(Integer.parseInt(x));}return String.join("-", t);}
}

二,3281. 范围内整数的最大得分

本题求数组两两之间最小的绝对差,那么最小值一定会出现在排序后相邻的两数之间,所以我们可以先将数组排序。又因为题目中的数据范围导致我们无法使用O(n^2)的做法,这时就需要至少O(nlogn)的做法,再结合排序和求最大值,自然而然就能想到二分,再分析一下是否具有单调性,答案越小,它越能使满足题目要求,具有单调性,所以该题的做法就是二分答案。

知道二分后,最难的一步就是如何判断二分的答案 k 是否满足条件,要想使得每个start[i]的范围都在[start[i],start[i] + d]之间,那么对于每个值都需要尽可能的小(这样后一个值才更可能处于范围内),所以我们的第一个值一定选择start[0],如果 x1 = start[0] + k 超过了 start[1] + d,那么 r 缩小;如果 x1 <= start[1] + d,此时还需要保证 x1 >= start[1],也就是 x1 = max(start[i],x0 + k),对于所有的 i 都满足 xi <= start[i] + d,那么 l 增大。

代码如下:

class Solution {public int maxPossibleScore(int[] start, int d) {int n = start.length;Arrays.sort(start);long l = 0, r = (start[n-1] - start[0] + d)/(n-1);//最大是均值while(l <= r){long mid = (l + r) / 2;if(check(mid, start, d)){l = mid + 1;}else{r = mid - 1;}}return (int)l-1;}boolean check(long k, int[] start, int d){int n = start.length;long now = start[0];for(int i=1; i<n; i++){now = Math.max(now + k, start[i]);if(now > start[i] + d) return false;}return true;}
}

三,3282. 到达数组末尾的最大得分

本题看到后的第一个想法就是dfs选或不选,记录前一个选择的下标 j,看是否选择nums[i]。但是对于本题来说,dfs的做法的时间复杂度是O(n^2),它一定会超时,所以需要其他做法。

"dp的尽头是贪心",所以我们可以试着使用贪心的思路去做,下面画个图理解一下:

我们将数组转换成矩形,那么计算最大总得分就变成了计算矩形的最大面积,那么要想面积大,那么对于每个下标 i 来说,当前能得到的面积一定是max(nums[0:i])。注意:题目中的终点是n-1!!

代码如下:

class Solution {public long findMaximumScore(List<Integer> nums) {int n = nums.size();long ans = 0, mx = nums.get(0);for(int i=1; i<n; i++){ans += mx;mx = Math.max(mx, nums.get(i));}return ans;}
}

四,3283. 吃掉所有兵需要的最多移动次数

本题是一道综合题,我们需要先通过 bfs 计算出(kx,ky) 与 (xi,yi) 任意两点之间的距离(指🐎从a -> b最小的移动距离),预处理之后,问题就变成了从 0 开始,将所有点联通所需的最大移动次数。

假设有 n 个兵,考虑下面两种情况:

  • Alice 吃 1 号兵,Bob 吃 2 号兵,Alice 吃 3 号兵,轮到 Bob 操作
  • Bob 吃 1 号兵,Alice 吃 2 号兵,Alice 吃 3 号兵,轮到 Bob 操作

可以发现上述两种做法都是 Alice 吃 3 号兵,轮到 Bob 操作,具有重复子问题,可以使用dfs来做。根据上述情况,我们需要两个参数:

  • i:表示前一个被吃掉的兵
  • mask:表示所有已经被吃掉的兵的集合

还有一点需要注意:Alice 和 Bob 所进行的操作不相同,所以需要分别讨论:

  • 当 mask 中 1 的个数为奇数时,说明轮到 Alice 操作,假设当前选 j(不在mask集合中),dfs(i,mask) = max(dfs(j,maskUk) + dis[i][j])
  • 当 mask 中 1 的个数为偶数时,说明轮到 Bob 操作,假设当前选 j(不在mask集合中),dfs(i,mask) = min(dfs(j,maskUk) + dis[i][j])

代码如下:

class Solution {int[][] dirct = new int[][]{{1,2},{-1,-2},{-1,2},{1,-2},{2,1},{-2,-1},{-2,1},{2,-1}};public int maxMoves(int kx, int ky, int[][] positions) {int n = positions.length;//(kx,ky)->(i,j)的最短距离//将(kx, ky) 和 (xi, yi) 依次当成 0 1 2 3 ..... nint[][] dis = new int[n+1][n+1];int[][] f = bfs(kx, ky);for(int i=0; i<n; i++){dis[0][i+1] = dis[i+1][0] = f[positions[i][0]][positions[i][1]];}for(int i=0; i<n; i++){f = bfs(positions[i][0], positions[i][1]);for(int j=i+1; j<n; j++)dis[i+1][j+1] = dis[j+1][i+1] = f[positions[j][0]][positions[j][1]];}//点到点的最短距离//从0开始互相联通的最多移动次数memo = new int[n+1][1<<(n+1)];for(int i=0; i<=n; i++)Arrays.fill(memo[i], -1);return dfs(0, 1, dis);}int[][] memo;int dfs(int i, int mask, int[][] dis){int cnt = Integer.bitCount(mask);if(cnt == dis.length) return 0;if(memo[i][mask] != -1) return memo[i][mask];int res = cnt%2==1?Integer.MIN_VALUE:Integer.MAX_VALUE;for(int j=1; j<dis.length; j++){if((mask>>j&1)==1) continue;if(cnt%2 == 1) res = Math.max(res, dfs(j, mask|1<<j, dis) + dis[i][j]);//Alice要求最大路径if(cnt%2 == 0) res = Math.min(res, dfs(j, mask|1<<j, dis) + dis[i][j]);//Bob要求最短路劲}return memo[i][mask] = res;}int[][] bfs(int kx, int ky){//计算从 (kx, ky) -> (x, y) 的最小移动次数int[][] f = new int[50][50];Queue<int[]> que = new LinkedList<>();que.add(new int[]{kx, ky});while(!que.isEmpty()){int size = que.size();while(size-- > 0){int[] t = que.poll();for(int[] d : dirct){int x = t[0] + d[0], y = t[1] + d[1];if(x>=0 && x<50 && y>=0 && y<50 && f[x][y]==0){f[x][y] = f[t[0]][t[1]] + 1;que.add(new int[]{x, y});}}}}return f;}
}


http://www.ppmy.cn/news/1525608.html

相关文章

EG边缘计算网关连接中移ONENET物联网平台(MQTT协议)

上文&#xff1a;EG边缘计算网关连接阿里云物联网平台&#xff08;MQTT协议&#xff09; 需求概述 本章节主要实现一个流程&#xff1a;EG8200mini采集Modbus RTU数据&#xff0c;通过MQTT协议连接中移ONENET物联网平台 Modbus RTU采集此处不做过多赘述&#xff0c;可参考其…

在线小说|基于java的小说阅读系统小程序(源码+数据库+文档)

在线小说|小说阅读系统|小说阅读系统小程序 目录 基于java的小说阅读系统小程序 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布…

MySQL一:在Ubuntu下安装MySQL数据库

目录 前言 1.查看操作系统版本 2.添加MySQLAPT源 2.1下载发布包 ​编辑 2.2安装发布包 3.安装MySQL 4.查看MySQL状态 5.开启自启动 ​编辑 6.登录MySQL 前言 操作系统版本为Ubuntu 22.04.6LTS 1.查看操作系统版本 lsb_release -a 2.添加MySQLAPT源 2.1下载发布包 M…

鸿蒙(API 12 Beta6版)超帧功能开发【顶点标记】

概述 OpenGTX是GPU Turbo X的开放式入口&#xff0c;根据游戏开发者主动提供的游戏过程中的关键信息&#xff0c;使能LTPO&#xff08;动态帧率/刷新率&#xff09;等游戏加速方案&#xff0c;助力游戏开发者打造高画质、高流畅、低功耗极致体验。LTPO通过动态感知游戏渲染状态…

ACL 2024:交叉领域情感分析——论文阅读笔记

前言 阅读了一篇ABSA的论文&#xff0c;在这里写下自己的一些理解小笔记&#xff0c;可能有点小乱&#xff0c;原文在这下面&#xff1a; 论文链接&#xff1a;Refining and Synthesis: A Simple yet Effective Data Augmentation Framework for Cross-Domain Aspect-based Sen…

vue2响应式系统是如何实现的(手写)

引言 喜欢请点赞&#xff0c;支持点在看。 关注牛马圈&#xff0c;干货不间断。 忆往昔 回头看&#xff0c;已经使用vue2多年&#xff0c;虽然也掌握了其他几种前端框架&#xff0c;但对vue2是真爱。 核心概念 Object.defineProperty Vue 2的响应式系统核心是使用了Object.de…

深入理解java并发编程之aqs框架

跟synchronized 相比较&#xff0c;可重入锁ReentrankLock其实原理有什么不同&#xff1f; 所得基本原理是为了达到一个目的&#xff1b;就是让所有线程都能看到某种标记。synchronized通过在对象头中设置标记实现了这一目的&#xff0c;是一种JVM原生的锁实现方式。而Reentran…

​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​

1. 请尽可能详细地说明&#xff0c;进程和线程的区别&#xff0c;分别有哪些应用场景&#xff1f;进程间如何通信&#xff1f;线程间如何通信&#xff1f;你的回答中不要写出示例代码。 进程和线程是操作系统中的两个基本概念&#xff0c;它们在计算机系统中扮演着不同的角色&…

《数据结构(C语言版)第二版》第八章-排序(8.5-归并排序、8.6基数排序、8.7 外部排序)

8.5 归并排序 (Merging Sort) 【基本思想】 将两个或两个以上的有序表合并成一个有序表的过程。 将两个有序表合并成一个有序表的过程称为2-路归并&#xff0c;2-路归并最为简单和常用。 假设初始序列含有n个记录&#xff0c;则可看成是n个有序的子序列&#xff0c;每个子序列…

Git换行符自动转换参数core.autocrlf的用法

core.autocrlf 是 Git 中用于控制换行符自动转换的配置选项。它有以下几个可能的值&#xff1a; 1. true 作用&#xff1a;在 checkin 时将 CRLF 转换为 LF&#xff0c;在 checkout 时将 LF 转换为 CRLF。适用场景&#xff1a;适用于 Windows 用户&#xff0c;希望在本地文件…

如何让Windows控制台窗口不接受鼠标点击(禁用鼠标输入)

一、简述 在我们编写控制台应用程序时&#xff0c;默认情况下程序的打印输出会在控制台窗口中进行显示&#xff0c;我们在写服务功能时在窗口中会不断打印消息输出&#xff0c;这个时候如果使用鼠标点击了控制台窗口&#xff0c;会阻塞程序的继续运行&#xff0c;导致我们的程…

Python安装:Mac 使用brew 安装Python2 和 Python3

安装python ## python2 brew install python ## python3 brew install python3出现错误 Error: An unexpected error occurred during the brew link step The formula built, but is not symlinked into /usr/local Permission denied dir_s_mkdir - /usr/local/Frameworks …

uniapp媒体

uni.previewImage实现图片放大预览 // 图片预览函数function onPreview(index) {// 收集所有图片的urlvar urls pets.value.data.map(item > item.url)// 预览图片uni.previewImage({current: index, // 当前预览的图片索引urls: urls // 所有图片的url数组})}

HarmonyOS】ArkTS学习之基于TextTimer的简易计时器的elapsedTime最小时间单位问题

本文旨在纪录自己对TextTimer使用过程的疑惑问题 我在查看教程时候&#xff0c;发现很多博客在onTimer(event: (utc: number, elapsedTime: number) > void) 这里提到elapsedTime&#xff1a;计时器经过的时间&#xff0c;单位为毫秒。我不清楚是否为版本问题。 在我查看ver…

编写XBOX控制器实现鼠标键盘输入

1.核心部分, XINPUT输入封装 XInput封装https://mp.csdn.net/mp_blog/creation/editor/1420701282.对话框窗口编写 Win32 对话框封装-CSDN博客https://blog.csdn.net/Flame_Cyclone/article/details/142110008?spm1001.2014.3001.5501 3.使用到的其他封装 字符串编码转换与…

Azure web app has no access to openai private endpoint in virtual network

题意&#xff1a;"Azure Web 应用无法访问虚拟网络中的 OpenAI 私有端点。" 问题背景&#xff1a; I am trying to host a web application similar to a private ChatGPT instance within a secluded virtual network, ensuring that theres no external internet …

以太网--TCP/IP协议(二)

上文中讲述了IP协议&#xff0c;本文主要来讲一下TCP协议。 TCP协议 &#xff08;1&#xff09;端到端通信 直接把源主机应用程序产生的数据传输到目的主机使用这 些数据的应用程序中&#xff0c;就是端到端通信。 &#xff08;2&#xff09;传输层端口 公认端口&#xff0…

CCF刷题计划——训练计划(反向拓扑排序)

训练计划 计算机软件能力认证考试系统 这道题70分还是很好拿的。后面30分需要用到 反向拓扑排序 &#xff0c;相对而言就麻烦点&#xff0c;需要逆序遍历。不着急&#xff0c;我们慢慢来。首先给出70分的代码。 本题可以学到&#xff1a;反向拓扑排序 70分题解&#xff1a;…

红黑树的删除

文章目录 前言一.删除的节点左子树右子树都有二.删除的节点只有左/右子树删除调整操作 三.删除的节点没有孩子1.删除的节点为红色2.删除的节点为黑色1).兄弟节点为黑色(1).兄弟节点至少有一个红色的孩子节点LL型RR型RL型LR型 (2).兄弟节点没有孩子或所有孩子为黑色 2).兄弟节点…

【贪心算法】贪心算法

贪心算法简介 1.什么是贪心算法2.贪心算法的特点3.学习贪心的方向 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.什么是贪心算法 与其说是…