Leetcode - 周赛418

目录

一,3309. 连接二进制表示可形成的最大数值

二,3310. 移除可疑的方法

三,3311. 构造符合图结构的二维矩阵

四,3312. 查询排序后的最大公约数


一,3309. 连接二进制表示可形成的最大数值

本题数据范围较小,可以使用递归枚举每一种排列方式,计算出最大值,代码如下:

class Solution {int ans = 0;public int maxGoodNumber(int[] nums) {dfs(0, "", nums);return ans;}void dfs(int i, String res, int[] nums){if(i == (1<<3)-1){ans = Math.max(ans, Integer.parseInt(res, 2));return;}for(int j=0; j<3; j++){if((i>>j&1)==1) continue;dfs(i|1<<j, res + Integer.toBinaryString(nums[j]), nums);}return ;}
}

但是该方式只适用于数据范围较小的题,下面介绍一种 O(nlogn) 的做法,我们先用十进制的方式来思考一下,给你一个数组 [9,10] ,如何使得这个数组用十进制并接得到的值更大?我们当然是比较一下:是9在前大,还是10在前大,然后决定这两个拼接的顺序。那么拓展到大小为 n 的数组如何决定它们的顺序?和上述做法一样,相邻的数依次比较,类似于冒泡排序。那么对于本题使用二进制拼接也是同理,代码如下:

class Solution {public int maxGoodNumber(int[] t) {Integer[] nums = new Integer[t.length];for(int i=0; i<t.length; i++)nums[i] = t[i];//注意要想按照自己的想法排序,必须使用Integer数组Arrays.sort(nums, (x, y)->{int len_x = Integer.toBinaryString(x).length();int len_y = Integer.toBinaryString(y).length();int xy = x << len_y | y;int yx = y << len_x | x;return yx - xy;});int ans = 0;for(int x : nums){int len = Integer.toBinaryString(x).length();ans = ans << len | x;}return ans;}
}

二,3310. 移除可疑的方法

本题题意给你一个可疑方法 k,如果被 k 直接调用/间接调用,那么这些方法也被视为可疑方法(注意:调用可疑方法的方法不是可疑方法),如果没有其他方法调用可疑方法,返回非可疑方法;否则,返回所用方法。

我们可以建立一个图,使用 dfs/bfs 找到所有的可疑方法,然后枚举 invocations 数组,比如每个元素为 [x,y],如果 x 不是可疑方法 && y 是可疑方法,说明有非可疑方法调用可疑方法,返回所有方法;否则只返回非可疑方法。

代码如下:

class Solution {public List<Integer> remainingMethods(int n, int k, int[][] invocations) {List<Integer> ans = new ArrayList<>();List<Integer>[] g = new ArrayList[n];Arrays.setAll(g, e->new ArrayList<>());for(int[] e : invocations){g[e[0]].add(e[1]);}Queue<Integer> que = new LinkedList<>();que.add(k);Set<Integer> set = new HashSet<>();set.add(k);while(!que.isEmpty()){int x = que.poll();for(int y : g[x]){if(!set.contains(y)){que.add(y);set.add(y);}}}for(int[] e : invocations){if(!set.contains(e[0]) && set.contains(e[1])){for(int i=0; i<n; i++)ans.add(i);return ans;}}for(int i=0; i<n; i++){if(!set.contains(i))ans.add(i);}return ans;}
}

三,3311. 构造符合图结构的二维矩阵

本题可以想象成拼拼图,我们可以先找到四个角落的点(如果行列>=3,那么它只有两个相邻的点),然后不断的往里拼,但是本题不知道四个角的对应位置,所以我们可以先找到一个角洛的点,然后往一边拼,注意一个边上点(除了角落的点),它们相邻的点有三个,不断的填充,直到找到一个这条边的另一个角落(即只有两个相邻点的点),这样我们就拼出一个边了,然后通过这个边不断的往下拼就行了。

上述是行列>=3的情况,如果它只有一行/列,那么它所有点中最少的相邻点必须为1,所以只需要判断最少的相邻是否为1,就直到是否是一行/列。

如果它只有两行/列,那么只需要判断所有点中最多的相邻点是否为4,如果不为4且不是一行/列,说明它只用两行/列。

代码如下:

class Solution {public int[][] constructGridLayout(int n, int[][] edges) {List<Integer>[] g = new ArrayList[n];Arrays.setAll(g, e->new ArrayList<>());for(int[] e : edges){g[e[0]].add(e[1]);g[e[1]].add(e[0]);}int[] node = new int[5];Arrays.fill(node, -1);for(int x=0; x<n; x++){node[g[x].size()] = x;}List<Integer> row = new ArrayList<>();if(node[1] != -1){row.add(node[1]);}else if(node[4]==-1){int x = node[2];for(int y : g[x]){if(g[y].size() == 2){row.add(x);row.add(y);break;}}}else{int x = node[2];row.add(x);int pre = x;x = g[x].get(0);while(g[x].size() == 3){row.add(x);for(int y : g[x]){if(y != pre && g[y].size() < 4){pre = x;x = y;break;}}}row.add(x);}int k = row.size();int[][] ans = new int[n/k][k];boolean[] vis = new boolean[n];for(int j=0; j<k; j++){//把第一行放进去int x = row.get(j);ans[0][j] = x;vis[x] = true;}for(int i=1; i<ans.length; i++){for(int j=0; j<k; j++){for(int y : g[ans[i-1][j]]){if(!vis[y]){vis[y] = true;ans[i][j] = y;break;}}}}return ans;}
}

四,3312. 查询排序后的最大公约数

本题最重要的部分就是计算出每个 gcd 出现的次数,对于查询,我们可以使用二分前缀和的方式算出答案。

如何计算每个 gcd 出现的次数?假设要计算 gcd 等于 2 出现的次数,比如说有 n 个 2 的倍数,那么我们可以得到 Cn2 个数对(即 (n-1)*n/2 ),但是这么多数对,不一定每一个 gcd 的值都为 2,比如 4 和 8 的 gcd 就为 4,6 和 12 的 gcd 就为 6,所以我们需要从 (n-1)*n/2 个数对中减去数对的 gcd 为 4,6,8,....。这样就能得到 gcd 为 2 的数对个数了。

定义 cntGcd[i] 表示 gcd 为 i 的数对的个数,cntGcd[i] = (n-1)*n/2 - cntGcd[2*i] - cntGcd[3*i] - ...,从上述公式可以看出,要想计算出 cntGcd[i],必须先计算出 cntGcd[2*i]、cntGcd[3*i],所以我们需要从后往前遍历。

代码如下:

class Solution {//cnt[2] = C(n,2) - cnt[4] - cnt[6] - ...public int[] gcdValues(int[] nums, long[] queries) {int[] cntX = new int[50001];int mx = 0;for(int x : nums){cntX[x]++;mx = Math.max(mx, x);} long[] cnt = new long[mx+1];for(int i=mx; i>=1; i--){int s = 0;for(int j=i; j<mx+1; j+=i){s += cntX[j];cnt[i] -= cnt[j]; //去除2i,3i,4i...(虽然j从i开始,但是cnt[i]初始值为0,所以实际上没有减去i)//为什么不是从2*i开始?因为要计算i的倍数的和s,如果从2i开始会少计算i出现的个数!!}cnt[i] += (long)(s - 1) * s / 2;}for(int i=1; i<mx+1; i++){cnt[i] += cnt[i-1]; }int[] ans = new int[queries.length];for(int i=0; i<queries.length; i++){int l = 1, r = mx;while(l <= r){int mid = (l + r) / 2;if(cnt[mid] <= queries[i]){//为什么加=?因为query[i]可以取到0(当然也可以写成cnt[mid]-1 < queries[i])l = mid + 1;}else{r = mid - 1;}}ans[i] = l;}return ans;}
}

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

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

相关文章

鼓组编写:SsdSample鼓映射 GM Map 自动保存 互换midi位置 风格模板 逻辑编辑器

SsdSample音源的键位映射 方便编写鼓的技巧 可以这样去设置键位关系的面板和钢琴卷帘窗的面板&#xff0c;方便去写鼓。 可以先按GM的midi标准去写鼓&#xff0c;然后比对下鼓的键位映射的关系&#xff0c;去调整鼓。 可以边看自己发b站等处的图文笔记&#xff0c;然后边用电…

网络初识基本概念总结

网络发展背景 经历了 单机阶段 -> 局域网阶段 -> 广域网阶段 -> 移动互联网阶段 (简单介绍一下) 其他一些小概念 局域网LAN: 是把一些设备通过交换机 / 路由器连接, 形成的私有网络广域网WAN: 是把更多的局域网相互连接起来,当规模足够大时形成广域网交换机和路由器…

STM32F103ZET6 FREERTOS 双UART 多任务多串口输出(配置教程)

基本的stm32cubemx使用就不细说了&#xff0c;要想配置freertos&#xff0c;用这个工具配置那是相当方便和简单 1、系统晶振配置 使用外部时钟晶振&#xff0c;配置如图 2、系统定时器设置 serial wire 保证下次可以程序下载 SysTick 是 Cortex-M 内核中的一个系统定时器&a…

用C++编写信息管理系统(歌单信息管理)

C语言是面向过程的编程语言&#xff0c;而C是面向对象的编程语言&#xff0c;在书写代码时风格有所不同&#xff08;也存在很多共性&#xff09;。 程序说明 本次系统程序使用的是C语言进行编写&#xff0c;主要考虑怎么实现面向对象的问题。 因为本次程序属于小型系统程序&…

C语言 | 第十六章 | 共用体 家庭收支软件-1

P 151 结构体定义三种形式 2023/3/15 一、创建结构体和结构体变量 方式1-先定义结构体&#xff0c;然后再创建结构体变量。 struct Stu{ char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在学习小组 float score; //成绩 }; struct Stu stu1, stu2; //…

从二维到三维,电商行业有哪些变化?

从二维到三维&#xff0c;电商行业经历了一系列显著的变化&#xff0c;这些变化不仅体现在商品展示的方式上&#xff0c;还深刻影响了消费者的购物体验、电商平台的运营策略以及整个电商行业的竞争格局。 一、商品展示方式的变革 二维展示阶段&#xff1a; 在电商行业的早期&…

【黑苹果】记录MacOS升级Sonoma的过程

【黑苹果】记录MacOS升级Sonoma的过程 一、硬件二、提前说明三、准备OC四、选择驱动五、选择ACPI六、下载内核扩展七、其他问题 一、硬件 设备是神舟zx6-ct5da 具体参照下图 二、提前说明 本机器已经安装过 macOS Monterey 12.6&#xff0c;这次是升级到 macOS Sonoma 14。 …

Java后端面试题(day16)

目录 java常见的引用类型java中深拷贝和浅拷贝如何设计一个秒杀系统?谈一下对高并发的理解&#xff0c;平时怎么处理高并发问题?Comparable和Comparator区别&#xff1f;解决hash冲突有哪些方法&#xff1f;Synchronized锁的升级过程 java常见的引用类型 java的引用类型一般分…

图论day56|广度优先搜索理论基础 、bfs与dfs的对比(思维导图)、 99.岛屿数量(卡码网)、100.岛屿的最大面积(卡码网)

图论day56|广度优先搜索理论基础 、bfs与dfs的对比&#xff08;思维导图&#xff09;、 99.岛屿数量&#xff08;卡码网&#xff09;、100.岛屿的最大面积&#xff08;卡码网&#xff09;&#xff09; 广度优先搜索理论基础bfs与dfs的对比&#xff08;思维导图&#xff09;&…

C++调试方法(Vscode)(一) ——本地调试

初学者在调试一段代码的时候&#xff0c;经常出于不明原因&#xff0c;写出bug&#xff0c;导致程序崩溃。但是定位崩溃的地方时&#xff0c;往往采用简单而朴素的方法&#xff1a;即采用cout或者printf进行输出。这种方式既原始&#xff0c;又低效。一个合格的工程师应该是通过…

RabbitMQ简介及安装类

RabbitMQ概述-MQ介绍 RabbitMQ是一个开源的消息代理和队列服务器&#xff0c;它支持多种消息协议&#xff0c;并且可以轻松地与多种编程语言和框架集成。RabbitMQ是使用Erlang语言编写的&#xff0c;因此它具有高并发和高可用性的特点。以下是RabbitMQ的一些关键特性和概念 消息…

华为OD机试 - 区间交叠问题 - 贪心算法(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

Django的请求与响应

Django的请求与响应 1、常见的请求2、常见的响应3、案例 1、常见的请求 函数的参数request是一个对象&#xff0c;封装了用户发送过来的所有请求相关数据。 get请求一般用来请求获取数据&#xff0c;get请求也可以传参到后台&#xff0c;但是传递的参数显示在地址栏。 post请求…

【CSS3】css开篇基础(2)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

el-date-picker设置只有某些日期可选

示例图&#xff1a; <el-date-pickerv-model"topFormObj.upTime"type"date"value-format"timestamp"format"dd/MM/yyyy":picker-options"pickerOptions" /> 固定限制每周的周末周三不可选 data() {return {pickerOp…

[Python学习日记-46] Python 中第三方开源模块的安装、使用与上传自己写的模块

[Python学习日记-46] Python 中第三方开源模块的安装、使用与上传自己写的模块 简介 下载与安装 如何使用安装好的第三方开源模块 如何上传自己写的模块到 PyPi 简介 在前面的模块介绍和导入当中主要介绍的都是 Python 内置的一些模块&#xff0c;我们把它称为标准库&#…

【多版本并发控制(MVCC)】

并发事务问题&#xff1a; MySQL隔离级别-未提交读&#xff0c;提交读&#xff0c;可重复读&#xff0c;序列化 隔离级别对于并发事务的解决情况 隔离级别脏读不可重复读幻读未提交读不可不可不可读已提交可不可不可可重复读 &#xff08;默认&#xff09;可可不可串行化&…

vue+echarts实现雷达图及刻度标注

文章目录 前言代码实现实现效果总结 前言 最近项目有做数据可视化 大屏 不免再次使用些echarts应用 记录下其中echarts雷达图的实现 代码实现 先上代码 <template><div class"container"><div ref"chart" style"width: 500px; heig…

树莓派应用--AI项目实战篇来啦-11.OpenCV定位物体的实时位置

1. 介绍 本项目通过PCA9685舵机控制模块控制二自由度舵机云台固定在零点位置&#xff0c;然后通OpenCV检测到黄色小熊&#xff0c;找到中心位置并打印出中心位置的坐标&#xff0c;通过双色LED灯进行指示是否检测到目标&#xff0c;本项目为后面二维云台追踪物体和追踪人脸提供…

grpc的python使用

RPC 什么是 RPC &#xff1f; RPC&#xff08;Remote Procedure Call&#xff09;远程过程调用&#xff0c;是一种计算机通信协议&#xff0c;允许一个程序&#xff08;客户端&#xff09;通过网络向另一个程序&#xff08;服务器&#xff09;请求服务&#xff0c;而无需了解…